Εργασία με Σχόλια PDF

Εργασία με Σχόλια PDF

Εργασία με Σχόλια PDF

Τα σχόλια PDF στο Aspose.PDF FOSS για C++ αντιπροσωπεύονται από την βασική κλάση Annotation και τις συγκεκριμένες υποτύπους της (TextAnnotation, LinkAnnotation, HighlightAnnotation, FreeTextAnnotation, CircleAnnotation, WatermarkAnnotation, WidgetAnnotation και άλλους). Κάθε σελίδα εκθέτει τα σχόλια της μέσω του Page.Annotations(), που επιστρέφει ένα AnnotationCollection. Αυτός ο οδηγός καλύπτει την προσθήκη σχολίων σε μια σελίδα, την επανάληψη και την αφαίρεσή τους, την ανάγνωση σχολίων από υπάρχον έγγραφο, την προσάρτηση ενεργειών συνδέσμου, την προσαρμογή εμφάνισης και την εξομάλυνση των σχολίων.


Προσθήκη Σχολίων σε Σελίδα

Δημιουργήστε ένα συγκεκριμένο αντικείμενο σχολίου, τοποθετήστε το με ένα Rectangle και προσθέστε το στη συλλογή της σελίδας με AnnotationCollection.Add(). Το TextAnnotation αντιπροσωπεύει ένα σχόλιο τύπου αυτοκόλλητης σημείωσης που είναι αγκυρωμένο σε ένα σημείο της σελίδας:

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

int main() {
    Aspose::Pdf::Document doc("input.pdf");
    auto& page = doc.Pages()[1];

    Aspose::Pdf::Annotations::TextAnnotation note(doc);
    note.Rect(Aspose::Pdf::Rectangle(100.0, 700.0, 200.0, 720.0, false));
    note.Contents("Reviewed and approved");

    page.Annotations().Add(note);
    doc.Save("annotated.pdf");
}

Annotation.Contents() / Contents(value) λαμβάνουν και ορίζουν το κείμενο της σημείωσης, ενώ Annotation.Rect() / Rect(value) τοποθετούν το σχόλιο στη σελίδα.


Επανάληψη και Αφαίρεση Σχολίων

AnnotationCollection υποστηρίζει καταμέτρηση, προσπέλαση με δείκτη, ελέγχους μέλους και αφαίρεση με τιμή ή με δείκτη:

#include <aspose/pdf/document.hpp>

int main() {
    Aspose::Pdf::Document doc("input.pdf");
    auto& annotations = doc.Pages()[1].Annotations();

    std::cout << "Annotation count: " << annotations.Count() << "\n";

    for (int i = 0; i < annotations.Count(); ++i) {
        std::cout << "Contents: " << annotations[i].Contents() << "\n";
    }

    if (annotations.Count() > 0) {
        annotations.Delete(0);   // remove by index
    }
    annotations.Clear();         // remove everything
}

AnnotationCollection.Contains(annotation) και Remove(annotation) λειτουργούν σε μια συγκεκριμένη αναφορά σχολίου· Delete(index) αφαιρεί κατά θέση, και Delete(annotation) αφαιρεί ένα συγκεκριμένο σχόλιο χωρίς να χρειάζεται το δείκτη του. IsReadOnly() αναφέρει αν η συλλογή μπορεί να τροποποιηθεί.


Ανάγνωση σχολίων από υπάρχον έγγραφο

Όταν ένα έγγραφο φορτώνεται, τα σχόλιά του είναι ήδη γεμάτα και μπορούν να ελεγχθούν χωρίς να προστεθεί τίποτα. Annotation.AnnotationType() αναφέρει τον υποτύπο (AnnotationType::Text, AnnotationType::Highlight, AnnotationType::Link, AnnotationType::FreeText, AnnotationType::FileAttachment, AnnotationType::Watermark και άλλα):

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

int main() {
    Aspose::Pdf::Document doc("annotated.pdf");
    auto& annotations = doc.Pages()[1].Annotations();

    for (int i = 0; i < annotations.Count(); ++i) {
        auto& a = annotations[i];
        if (a.AnnotationType() == Aspose::Pdf::Annotations::AnnotationType::Text) {
            std::cout << "Note: " << a.Contents() << "\n";
        }
    }
}

Η σειρά των σχολίων και ο υποτύπος διατηρούνται κατά τη διαδικασία αποθήκευσης/επαναφόρτωσης, έτσι ο κώδικας που δείχνει στο Annotations() μετά τη φόρτωση ενός εγγράφου βλέπει την ίδια ακολουθία που υπήρχε όταν το αρχείο γράφτηκε.


Σχόλια συνδέσμων και ενέργειες

LinkAnnotation συνδέει μια περιοχή κλικ σε μια σελίδα και εκκινεί ένα PdfAction όταν ενεργοποιείται. NamedAction πηδά σε έναν προκαθορισμένο προορισμό πλοήγησης, JavascriptAction εκτελεί μια συμβολοσειρά ECMAScript, και SubmitFormAction αποστέλλει δεδομένα φόρμας σε ένα URL μέσω ενός FileSpecification:

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

int main() {
    Aspose::Pdf::Document doc;
    auto page = doc.Pages().Add();

    Aspose::Pdf::Annotations::LinkAnnotation link(
        page, Aspose::Pdf::Rectangle(0.0, 0.0, 100.0, 20.0, false));
    link.Action(Aspose::Pdf::Annotations::NamedAction(
        Aspose::Pdf::Annotations::PredefinedAction::LastPage));

    page.Annotations().Add(link);
    doc.Save("linked.pdf");
}

LinkAnnotation.Action(value) δέχεται οποιονδήποτε υποτύπο PdfAction και τον κλωνοποιεί εσωτερικά, έτσι το σχόλιο διατηρεί το δικό του αντίγραφο της ενέργειας. LinkAnnotation.Destination() / Destination(value) ορίζουν έναν σαφή προορισμό πλοήγησης αντί για ενέργεια, και Highlighting() / Highlighting(value) ελέγχουν την οπτική ανάδραση που εμφανίζεται όταν ο σύνδεσμος κλικάρεται.


Εμφάνιση σχολίου: Περιθώριο, Σημαίες και Χρώμα

Κάθε Annotation εκθέτει ένα Border, ένα bitfield των AnnotationFlags, και ένα Color που χρησιμοποιείται για την απόδοση της εμφάνισής του:

#include <aspose/pdf/annotations/border_style.hpp>
#include <aspose/pdf/annotations/annotation_flags.hpp>
#include <aspose/pdf/color.hpp>

// 'note' is an existing Annotation reference, e.g. from AnnotationCollection.
note.Border().Width(2);
note.Border().Style(Aspose::Pdf::Annotations::BorderStyle::Dashed);
note.Flags(Aspose::Pdf::Annotations::AnnotationFlags::Print);
note.Color(Aspose::Pdf::Color::Red());

Border.Style() δέχεται BorderStyle::Solid, Dashed, Beveled, Inset ή Underline. Border.Effect() υποστηρίζει επιπλέον ένα BorderEffect::Cloudy περίγραμμα με EffectIntensity() που ελέγχει πόσο έντονο είναι. AnnotationFlags είναι ένα bitfield — συνδυάστε τιμές όπως Print, NoZoom, ReadOnly και LockedContents για να ελέγξετε πώς μια σημείωση συμπεριφέρεται σε ένα πρόγραμμα προβολής χωρίς να αλλάζει το ορατό περιεχόμενό της.


Ισοπέδωση Σημειώσεων

Μια μεμονωμένη σημείωση μπορεί να ισοπεδωθεί — συγχωνευμένη με το περιεχόμενο της σελίδας και να γίνει μη διαδραστική — καλώντας το Annotation.Flatten() άμεσα:

#include <aspose/pdf/document.hpp>

int main() {
    Aspose::Pdf::Document doc("annotated.pdf");
    auto& annotations = doc.Pages()[1].Annotations();
    for (int i = 0; i < annotations.Count(); ++i) {
        annotations[i].Flatten();
    }
    doc.Save("flattened.pdf");
}

Για λειτουργίες σημειώσεων σε όλο το έγγραφο, το PdfAnnotationEditor ακολουθεί το κοινό πρότυπο Facade που χρησιμοποιείται σε όλο το API: συνδέστε ένα πηγαίο έγγραφο με το BindPdf(), εφαρμόστε μία ή περισσότερες λειτουργίες σημειώσεων και, στη συνέχεια, γράψτε το αποτέλεσμα με το Save():

#include <aspose/pdf/facades/pdf_annotation_editor.hpp>

int main() {
    Aspose::Pdf::Facades::PdfAnnotationEditor editor;
    editor.BindPdf("annotated.pdf");
    editor.FlatteningAnnotations();
    editor.Save("flattened.pdf");
}

PdfAnnotationEditor.DeleteAnnotations() αφαιρεί κάθε σημείωση από το δεσμευμένο έγγραφο· DeleteAnnotations(annotType) περιορίζει την αφαίρεση σε μια μόνο AnnotationType. ImportAnnotationsFromXfdf(xfdfFile) και ImportAnnotationsFromFdf(fdfFile) φορτώνουν δεδομένα σημειώσεων που έχουν εξαχθεί από άλλο πρόγραμμα προβολής PDF.


Συμβουλές και Καλές Πρακτικές

  • Πάντα προσθέστε μια νεοσυγκατασκευασμένη σημείωση στο Page.Annotations() πριν καλέσετε το Document.Save() — μια σημείωση που δεν προστίθεται ποτέ σε μια συλλογή δεν γράφεται στο αρχείο εξόδου.
  • Χρησιμοποιήστε το AnnotationCollection.Contains(annotation) πριν καλέσετε το Remove() εάν δεν είστε βέβαιοι ότι η σημείωση υπάρχει ακόμα· το Remove() επιστρέφει το false αντί να ρίχνει εξαίρεση όταν η σημείωση λείπει.
  • Ελέγξτε το Annotation.AnnotationType() πριν κάνετε μετατροπή ή διακλάδωση βάσει της συμπεριφοράς υποτύπου όταν επαναλαμβάνετε σημειώσεις που φορτώθηκαν από μη αξιόπιστο ή τρίτου μέρους αρχείο PDF.
  • Ισοπεδώστε τις σημειώσεις με το Annotation.Flatten() (ή το PdfAnnotationEditor.FlatteningAnnotations() για ολόκληρο το έγγραφο) πριν αρχειοθετήσετε ένα έγγραφο, ώστε οι αξιολογητές σε άλλα εργαλεία να βλέπουν την ίδια εμφάνιση που δημιουργήσατε.
  • Το AnnotationFlags είναι ένα bitfield — συνδυάστε τις σημαίες με τις υποκείμενες ακέραιες τιμές του enum αντί να υποθέτετε ότι μπορεί να είναι ενεργή μόνο μία σημαία τη φορά.

Συνηθισμένα προβλήματα

ΠρόβλημαΑιτίαΔιόρθωση
Η σημείωση δεν είναι ορατή μετά την αποθήκευσηΗ σημείωση δημιουργήθηκε αλλά ποτέ δεν προστέθηκε στο Page.Annotations()Κλήστε το page.Annotations().Add(annotation) πριν το doc.Save()
Το Remove() επιστρέφει falseΗ αναφορά της σημείωσης που περάστηκε δεν ταιριάζει με καμία καταχώρηση αυτή τη στιγμή στη συλλογήΧρησιμοποιήστε το Contains() πρώτα, ή αφαιρέστε με δείκτη χρησιμοποιώντας το Delete(index)
Λάθος τύπος σημείωσης μετά την επαναφόρτωσηΟ κώδικας υπέθεσε ένα συγκεκριμένο υποτύπο χωρίς να ελέγξει το AnnotationType()Διακλαδώστε στο Annotation.AnnotationType() πριν θεωρήσετε το αντικείμενο ως συγκεκριμένο υποτύπο
Η ενέργεια σύνδεσης φαίνεται να μην έχει οριστεί μετά την εκχώρησηΈνα τοπικό PdfAction βγήκε εκτός εμβέλειας· το LinkAnnotation.Action() επιστρέφει το κλωνοποιημένο αντίγραφο της σημείωσης, όχι το αρχικό αντικείμενοΔιαβάστε την ενέργεια ξανά μέσω του link.Action() αντί να διατηρείτε την αρχική τοπική μεταβλητή
Η λειτουργία PdfAnnotationEditor δεν έχει αποτέλεσμαBindPdf() δεν κλήθηκε, ή κλήθηκε με διαδρομή που δεν υπάρχειΕπιβεβαιώστε ότι το BindPdf() ολοκληρώνεται επιτυχώς πριν καλέσετε το FlatteningAnnotations() ή το DeleteAnnotations()

FAQ

Πώς μπορώ να προσθέσω μια σημείωση στυλ σχολίου σε μια σελίδα PDF;

Δομήστε ένα TextAnnotation με τον στόχο Document, ορίστε τα Rect() και Contents() του, και, στη συνέχεια, προσθέστε το στο page.Annotations() πριν αποθηκεύσετε.

Πώς μπορώ να μάθω τι είδους σημείωση παρατηρώ;

Κλήστε το Annotation.AnnotationType(), το οποίο επιστρέφει μια τιμή enum AnnotationType όπως Text, Link, Highlight, FreeText, FileAttachment ή Watermark.

Μπορεί μια σημείωση να φέρει περισσότερες από μία σημαίες;

Ναι. Το AnnotationFlags είναι ένα bitfield (Default, Invisible, Hidden, Print, NoZoom, ReadOnly, LockedContents και άλλα), επομένως πολλές σημαίες μπορούν να συνδυαστούν σε μία μόνο σημείωση.

Ποια είναι η διαφορά μεταξύ της εξομάλυνσης μιας σημείωσης και της εξομάλυνσης ενός εγγράφου;

Annotation.Flatten() συγχωνεύει μια μοναδική σημείωση στο περιεχόμενο της σελίδας της. Το PdfAnnotationEditor.FlatteningAnnotations() (προαιρετικά περιορισμένο από εύρος σελίδων και AnnotationType μέσω του υπερφορτωμένου που δέχεται start, end και annotType) εξομαλύνει ολόκληρο το δεσμευμένο έγγραφο με μία κλήση.

Πώς μπορώ να αφαιρέσω όλες τις σημειώσεις ενός τύπου από ένα έγγραφο;

Δέστε το έγγραφο με PdfAnnotationEditor.BindPdf(), καλέστε το DeleteAnnotations(annotType) με τον στόχο AnnotationType, στη συνέχεια Save() το αποτέλεσμα.


API Reference Περίληψη

Κλάση/ΜέθοδοςΠεριγραφή
AnnotationΑφηρημένη βασική κλάση για όλους τους υποτύπους σχολιασμού PDF
Annotation.Rect() / Rect(value)Αποκτήστε ή ορίστε το ορθογώνιο περιγράμματος του annotation
Annotation.Contents() / Contents(value)Λάβετε ή ορίστε το περιεχόμενο κειμένου της σημείωσης
Annotation.AnnotationType()Επιστρέφει την τιμή enum AnnotationType για αυτό το annotation
Annotation.Flags() / Flags(value)Λάβετε ή ορίστε το AnnotationFlags bitfield
Annotation.Border() / Border(value)Αποκτήστε ή ορίστε το Border της σημείωσης
Annotation.Color() / Color(value)Λάβετε ή ορίστε την εμφάνιση του annotation Color
Annotation.Flatten()Συγχωνεύει αυτήν την επισήμανση στο περιεχόμενο της σελίδας, καθιστώντας την μη διαδραστική
AnnotationCollectionΤαξινομημένη συλλογή επισήμανσεων σε μια σελίδα, που επιστρέφεται από το Page.Annotations()
AnnotationCollection.Add(annotation) / Add(annotation, considerRotation)Προσθέτει μια επισήμανση στη συλλογή
AnnotationCollection.Count()Επιστρέφει τον αριθμό των επισήμανσεων στη συλλογή
AnnotationCollection.Contains(annotation)Αναφέρει αν η συλλογή περιέχει τη δεδομένη σημείωση
AnnotationCollection.Remove(annotation)Καταργεί μια συγκεκριμένη σημείωση; επιστρέφει false αν δεν βρεθεί
AnnotationCollection.Delete(index) / Delete(annotation)Αφαιρεί μια επισήμανση με βάση το ευρετήριο ή με αναφορά
AnnotationCollection.Clear()Αφαιρεί όλες τις επισήμανσεις από τη συλλογή
TextAnnotationΕπισήμανση στυλ αυτοκόλλητης σημείωσης με Open() και Icon() (TextIcon)
LinkAnnotationΠεριοχή με δυνατότητα κλικ που αποστέλλει ένα PdfAction μέσω Action() / Action(value)
LinkAnnotation.Destination() / Destination(value)Λάβετε ή ορίστε έναν σαφή προορισμό πλοήγησης
HighlightAnnotationΣημαδεύει ένα τμήμα κειμένου με χρώμα επισήμανσης
FreeTextAnnotationΕμφανίζει μια υπόδειξη κειμένου· ρυθμίζεται μέσω Justification(), DefaultAppearanceObject(), Callout()
CircleAnnotationΣχεδιάζει μια έλλειψη εντός του ορθογωνίου της σημείωσης
WatermarkAnnotationΣημείωση επικάλυψης με έναν Opacity() / Opacity(value) πρόσβαση
WidgetAnnotationΣημείωση εμφάνισης πεδίου φόρμας με ReadOnly(), Required(), Exportable(), DefaultAppearance()
NamedActionΠροκαθορισμένη ενέργεια πλοήγησης (PredefinedAction enum) που μπορεί να προσαρτηθεί σε ένα LinkAnnotation
JavascriptActionΕκτελεί μια συμβολοσειρά ECMAScript μέσω Script() / GetECMAScriptString()
SubmitFormActionΑποστέλλει δεδομένα φόρμας σε μια FileSpecification URL μέσω Url() / Url(value)
BorderΠερίγραμμα σημείωσης με Width(), Style() (BorderStyle), Effect() (BorderEffect)
PdfAnnotationEditorFacade για εισαγωγή, τροποποίηση, flattening και διαγραφή annotation σε ολόκληρο το έγγραφο
PdfAnnotationEditor.FlatteningAnnotations()Flatten annotations σε όλο το δεσμευμένο έγγραφο
PdfAnnotationEditor.DeleteAnnotations(annotType)Διαγράφει όλα τα annotations του συγκεκριμένου AnnotationType
PdfAnnotationEditor.ImportAnnotationsFromXfdf(xfdfFile)Εισάγει annotations από ένα αρχείο XFDF

Δείτε επίσης

 Ελληνικά