Εισαγωγή

Οι σημειώσεις PDF καλύπτουν ένα ευρύ φάσμα διαδραστικών και οπτικών στοιχείων τοποθετημένων πάνω στο περιεχόμενο της σελίδας: αυτοκόλλητες σημειώσεις κειμένου, υπερσυνδέσεις, επισημασμένο ή διακριτό κείμενο, γεωμετρικά σχήματα, γραμμές μελάνης, συνημμένα αρχείων και σφραγίδες έγκρισης. Aspose.PDF FOSS για C++ αντιπροσωπεύει καθένα από αυτά ως μια συγκεκριμένη υποκλάση του Annotation, ώστε ο κώδικας που διασχίζει τις σημειώσεις μιας σελίδας να μπορεί να λειτουργεί γενικά απέναντι στη βασική κλάση ενώ εξακολουθεί να έχει πρόσβαση σε μέλη ειδικά για τον υποτύπο — όπως Icon() σε ένα TextAnnotation ή Action() σε ένα LinkAnnotation — όταν χρειάζεται.

Η απαρίθμηση Annotations::AnnotationType της βιβλιοθήκης καταγράφει τους υποτύπους που αναγνωρίζει: Text, Link, FreeText, Line, Square, Circle, Polygon, PolyLine, Highlight, Underline, Squiggly, StrikeOut, Stamp, Caret, Ink, Popup, FileAttachment, Sound, Movie, Widget, Screen, PrinterMark, Watermark, Redaction, RichMedia και αρκετά άλλα. Κάθε τιμή αντιστοιχεί σε μια συγκεκριμένη κλάση — CircleAnnotation, SquareAnnotation, PolygonAnnotation, PolylineAnnotation και LineAnnotation για σχήματα σήμανσης· FreeTextAnnotation και InkAnnotation για ελεύθερο κείμενο και σχεδιασμένες γραμμές· FileAttachmentAnnotation, SoundAnnotation, MovieAnnotation, ScreenAnnotation και RichMediaAnnotation για ενσωματωμένο περιεχόμενο· και WidgetAnnotation για εμφανίσεις πεδίων AcroForm.

Αυτή η ανάρτηση καλύπτει τη βασική API των Annotation και AnnotationCollection, προσθέτοντας σημειώσεις κειμένου και συνδέσμους, εντοπίζοντας τύπους σημειώσεων κατά τη φόρτωση ενός υπάρχοντος εγγράφου, καθώς και διαβάζοντας ή ενημερώνοντας τα μεταδεδομένα σήμανσης και τις σφραγίδες. Aspose.PDF FOSS για C++ είναι μια βιβλιοθήκη C++20 χωρίς εξαρτήσεις χρόνου εκτέλεσης πέρα από τη στάνταρ βιβλιοθήκη· τα headers περιλαμβάνονται απευθείας από τον φάκελο aspose/pdf/annotations/ και η βιβλιοθήκη δημιουργείται ως στόχος CMake.


Τι περιλαμβάνεται

Annotation και AnnotationCollection

Annotation είναι η βασική κλάση για κάθε υποτύπο σημείωσης. Εκθέτει κοινές ιδιότητες: Rect() / Rect(value) για το περιοχικό ορθογώνιο της σημείωσης, Contents() για το συσχετισμένο κείμενο, Name(), Color(), Flags() (μια μάσκα bits AnnotationFlagsPrint, Hidden, Invisible, NoZoom, ReadOnly και άλλα), Border(), Width() / Height(), AnnotationType() και PageIndex(). AnnotationCollection κρατά τις σημειώσεις σε μία σελίδα και είναι προσβάσιμη μέσω του Page.Annotations().

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/annotation_collection.hpp>
#include <iostream>

using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Annotations;

Document doc("reviewed.pdf");
AnnotationCollection& annots = doc.Pages()[1].Annotations();

std::cout << "Annotation count: " << annots.Count() << "\n";
for (int i = 0; i < annots.Count(); ++i) {
    Annotation& a = annots[i];
    std::cout << "  " << a.Name() << ": " << a.Contents() << "\n";
}

AnnotationCollection εκθέτει επίσης τις μεθόδους Add(annotation), Add(annotation, considerRotation), Delete(index), Delete(annotation), Clear(), Remove(annotation), Contains(annotation) και IsReadOnly().

Σημειώσεις κειμένου με TextAnnotation

TextAnnotation αντιπροσωπεύει το γνωστό σχόλιο σε αυτοκόλλητη σημείωση. Πέρα από τα βασικά μέλη του Annotation, προσθέτει τις μεθόδους Open() / Open(value) για να ελέγχει εάν η σημείωση εμφανίζεται επεκταμένη, καθώς και Icon() / Icon(value) (μια τιμή TextIcon όπως Note, Comment, Key, Help ή Check) για την επιλογή του εικονιδίου.

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>

using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Annotations;

Document doc("input.pdf");

TextAnnotation note{doc};
note.Rect(Rectangle{100.0, 700.0, 200.0, 720.0, false});
note.Contents("Reviewed by QA");
note.Icon(TextIcon::Comment);
note.Open(true);

doc.Pages()[1].Annotations().Add(note);
doc.Save("annotated.pdf");

Σύνδεσμοι και ενέργειες με LinkAnnotation

LinkAnnotation προσθέτει μια κλικ-περιοχή σε μια σελίδα. Κατασκευάζεται από τη μητρική Page και ένα Rectangle, και η συμπεριφορά του ορίζεται με Action(value)— οποιαδήποτε υποκλάση του PdfAction, συμπεριλαμβανομένου του NamedAction (προκαθορισμένη πλοήγηση όπως PredefinedAction::LastPage), GoToAction, GoToURIAction ή JavascriptAction. Η Destination() διαβάζει τον προορισμό IAppointment του συνδέσμου, και οι μέθοδοι Highlighting() / Highlighting(value) ορίζουν το HighlightingMode (None, Invert, Outline, Push, Toggle) που εφαρμόζεται όταν ενεργοποιείται ο σύνδεσμος.

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/link_annotation.hpp>
#include <aspose/pdf/annotations/named_action.hpp>

using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Annotations;

Document doc;
Page page = doc.Pages().Add();

LinkAnnotation link{page, Rectangle{0.0, 0.0, 100.0, 20.0, false}};
link.Action(NamedAction{PredefinedAction::LastPage});
link.Highlighting(HighlightingMode::Push);

page.Annotations().Add(link);

Ανίχνευση τύπων σήμανσης κατά τη φόρτωση

Όταν ανοίγεται ένα έγγραφο, οι υπάρχουσες σημειώσεις είναι ήδη γεμισμένες σε κάθε AnnotationCollection της σελίδας, και η AnnotationType() προσδιορίζει ποιος συγκεκριμένος υποτύπος αντιπροσωπεύει κάθε καταχώρηση. Αυτό επιτρέπει στον κώδικα που καλεί να κάνει διακλάδωση με βάση την τιμή του enum χωρίς να γνωρίζει εκ των προτέρων ποιους τύπους σημειώσεων περιέχει ένα δεδομένο PDF.

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/annotation_type.hpp>
#include <iostream>

using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Annotations;

Document doc("mixed-annotations.pdf");
auto& annots = doc.Pages()[1].Annotations();

for (int i = 0; i < annots.Count(); ++i) {
    switch (annots[i].AnnotationType()) {
        case AnnotationType::Text:      std::cout << "Text note\n"; break;
        case AnnotationType::Link:      std::cout << "Link\n"; break;
        case AnnotationType::Circle:    std::cout << "Circle shape\n"; break;
        case AnnotationType::Square:    std::cout << "Square shape\n"; break;
        case AnnotationType::Highlight: std::cout << "Highlight\n"; break;
        case AnnotationType::Stamp:     std::cout << "Stamp\n"; break;
        default: break;
    }
}

Μεταδεδομένα Markup Annotation

MarkupAnnotation είναι η βάση για σημειώσεις που μεταφέρουν μεταδεδομένα αξιολογητή: Title() (ο συγγραφέας), Subject(), RichText() για μορφοποιημένο κείμενο σχολίου, και Opacity() για ανάμειξη με το περιεχόμενο της σελίδας. Οι InReplyTo() και Popup() συνδέουν μια σημείωση markup με το νήμα σχολίων στο οποίο ανήκει, και οι ClearState() / SetReviewState(state, userName) διαχειρίζονται την κατάσταση αξιολόγησής της. Οι HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation και SquigglyAnnotation είναι υποτύποι markup που τοποθετούνται πάνω από το κείμενο· η κοινή βάση τους TextMarkupAnnotation προσθέτει QuadPoints() για τον ορισμό των τετραπλεύρων περιοχών που καλύπτονται και GetMarkedText() για την ανάγνωση του κειμένου που βρίσκεται από κάτω.

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/markup_annotation.hpp>

using namespace Aspose::Pdf::Annotations;

for (int i = 0; i < annots.Count(); ++i) {
    if (auto* markup = dynamic_cast<MarkupAnnotation*>(&annots[i])) {
        markup->Title("QA Reviewer");
        markup->Subject("Layout issue");
        markup->Opacity(0.6);
    }
}

Σφραγιδιασμένες Σημειώσεις με StampAnnotation

StampAnnotation τοποθετεί μια προκαθορισμένη ή προσαρμοσμένη σφραγίδα σε μια σελίδα. Η Icon() / Icon(value) επιλέγει μια τιμή StampIconApproved, Draft, Confidential, Final, Expired, NotApproved, ForComment, TopSecret και άλλες— και η Image() / Image(value) παρέχει ακατέργαστα bytes εικόνας για προσαρμοσμένη εμφάνιση σφραγίδας αντί για ενσωματωμένο εικονίδιο.

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/stamp_annotation.hpp>

using namespace Aspose::Pdf::Annotations;

for (int i = 0; i < annots.Count(); ++i) {
    if (auto* stamp = dynamic_cast<StampAnnotation*>(&annots[i])) {
        stamp->Icon(StampIcon::Approved);
    }
}

Γρήγορη Εκκίνηση

Προσθέστε τη βιβλιοθήκη ως υποκατάλογο CMake και συνδέστε την με τον προορισμό aspose_pdf_foss:

add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)

Ανοίξτε ένα έγγραφο, προσθέστε μια σημείωση κειμένου και διαβάστε ξανά τον αριθμό των σημειώσεων:

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>
#include <iostream>

using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Annotations;

int main() {
    Document doc("input.pdf");

    TextAnnotation note{doc};
    note.Rect(Rectangle{100.0, 700.0, 200.0, 720.0, false});
    note.Contents("Reviewed by QA");
    note.Icon(TextIcon::Comment);

    doc.Pages()[1].Annotations().Add(note);
    doc.Save("annotated.pdf");

    std::cout << "Annotations on page 1: "
              << doc.Pages()[1].Annotations().Count() << "\n";
}

Υποστηριζόμενες Μορφές

ΜορφήΕπέκτασηΑνάγνωσηΕγγραφή
BMP.bmp
JPEG.jpg
TIFF.tiff
Text.txt
SVG.svg

Η υποστήριξη μορφής εφαρμόζεται στην απόδοση σελίδας και στις επιλογές φόρτωσης σε επίπεδο εγγράφου· αυτές οι καταχωρήσεις αντανακλούν επιβεβαιωμένες διαδρομές εξαγωγής (BmpDevice, JpegDevice, TiffDevice, TextDevice) και εισαγωγής (SvgLoadOptions) αντί για σειριοποίηση ειδική για σημειώσεις.


Ανοιχτός Κώδικας & Άδειες

Aspose.PDF FOSS για C++ κυκλοφορεί υπό την άδεια MIT. Ο πηγαίος κώδικας είναι διαθέσιμος στο https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp, και η βιβλιοθήκη μπορεί να χρησιμοποιηθεί σε εμπορικά και ανοιχτού κώδικα έργα χωρίς χρεώσεις άδειας.


Ξεκινώντας

Σχετικοί Πόροι