Πώς να εργαστείτε με τις σημειώσεις PDF σε C++
Aspose.PDF FOSS για C++ αντιπροσωπεύει κάθε σημείωση PDF ως υποκατηγορία της κοινής βάσης Annotation, και εκθέτει τις σημειώσεις σε μια σελίδα μέσω του AnnotationCollection που επιστρέφεται από το Page::Annotations(). Αυτός ο οδηγός προσθέτει μια σημείωση κειμένου απλού κειμένου και μια στυλιζαρισμένη σημείωση σε μια σελίδα με TextAnnotation, αποθηκεύει το έγγραφο, και στη συνέχεια το ανοίγει ξανά για να διαβάσει τις σημειώσεις και να αφαιρέσει μία. Η βιβλιοθήκη ενσωματώνεται σε ένα έργο CMake ως εξάρτηση υποκαταλόγου — δεν υπάρχει βήμα εγκατάστασης μέσω καταχωρητή πακέτων.
Οδηγός βήμα-βήμα
Βήμα 1: Εγκατάσταση του πακέτου
Προσθέστε τη βιβλιοθήκη ως υποκατάλογο CMake και συνδέστε τον στόχο της στατικής βιβλιοθήκης:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)Επαληθεύστε ότι η αλυσίδα εργαλείων και το βήμα σύνδεσης επιλύονται σωστά με ένα ελάχιστο πρόγραμμα:
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc;
std::cout << "Linked OK — pages: " << doc.Pages().Count() << "\n";
}Μια επιτυχής κατασκευή που εμφανίζει το pages: 0 επιβεβαιώνει ότι η βιβλιοθήκη είναι συνδεδεμένη.
Βήμα 2: Εισαγωγή Απαιτούμενων Κλάσεων
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/page_collection.hpp>
#include <aspose/pdf/rectangle.hpp>
#include <aspose/pdf/color.hpp>
#include <aspose/pdf/annotations/annotation.hpp>
#include <aspose/pdf/annotations/annotation_collection.hpp>
#include <aspose/pdf/annotations/annotation_type.hpp>
#include <aspose/pdf/annotations/annotation_flags.hpp>
#include <aspose/pdf/annotations/border.hpp>
#include <aspose/pdf/annotations/border_style.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Annotations;Βήμα 3: Δημιουργία Εγγράφου και Προσθήκη Σελίδας
Δημιουργήστε ένα νέο έγγραφο και προσθέστε μια σελίδα σε αυτό. PageCollection::Add() επιστρέφει το νεοπροστέθηκε Page:
Document doc;
Page page = doc.Pages().Add();Βήμα 4: Προσθήκη Σχόλιου Κειμένου στη Σελίδα
TextAnnotation εμφανίζεται ως σχόλιο στυλ αυτοκόλλητης σημείωσης. Δημιουργήστε το από το ιδιοκτήτη Document, ορίστε τη θέση του με Rect() και το μήνυμά του με Contents(), μετά προσθέστε το στο AnnotationCollection της σελίδας:
TextAnnotation note{doc};
note.Rect(Rectangle(100.0, 700.0, 200.0, 720.0, false));
note.Contents("Reviewed and approved.");
page.Annotations().Add(note);Βήμα 5: Στυλιζάστε ένα Δεύτερο Σχόλιο με Χρώμα, Περιθώριο και Σημαίες
Annotation εκθέτει επίσης Color(), Border() και Flags(). Flags() δέχεται ένα AnnotationFlags bit field — συνδυάστε τιμές με λογικό OR για να ορίσετε περισσότερες από μία σημαίες ταυτόχρονα:
TextAnnotation flagged{doc};
flagged.Rect(Rectangle(100.0, 600.0, 300.0, 650.0, false));
flagged.Contents("Needs follow-up");
flagged.Color(Color::FromRgb(220, 20, 20));
flagged.Flags(AnnotationFlags::Print | AnnotationFlags::ReadOnly);
flagged.Border().Width(2);
flagged.Border().Style(BorderStyle::Dashed);
page.Annotations().Add(flagged);Βήμα 6: Αποθήκευση του Εγγράφου
Τίποτα δεν γράφεται στο δίσκο μέχρι να εκτελεστεί το Save():
doc.Save("annotated.pdf");Βήμα 7: Ξαναανοίξτε το PDF και διαβάστε τις σημειώσεις του
Ξαναανοίξτε το αποθηκευμένο αρχείο και διαβάστε ξανά το AnnotationCollection της πρώτης σελίδας. Το AnnotationCollection είναι μηδενικής βάσης, και το Count() αναφέρει πόσες σημειώσεις περιέχει η σελίδα:
Document reopened("annotated.pdf");
auto& annots = reopened.Pages()[1].Annotations();
std::cout << "Annotation count: " << annots.Count() << "\n";
for (int i = 0; i < annots.Count(); ++i) {
const auto& a = annots[i];
if (a.AnnotationType() == AnnotationType::Text) {
std::cout << "Text annotation: " << a.Contents() << "\n";
}
}Βήμα 8: Αφαιρέστε μια σημείωση και αποθηκεύστε ξανά
AnnotationCollection::Delete(index) αφαιρεί μια σημείωση με βάση τη θέση της (μηδενική βάση). Διαγράψτε την πρώτη σημείωση και αποθηκεύστε το αποτέλεσμα σε νέο αρχείο:
annots.Delete(0);
reopened.Save("annotated-cleaned.pdf");Κοινά προβλήματα και διορθώσεις
Τίποτα δεν αλλάζει στο αποθηκευμένο PDF μετά την κλήση Annotations().Add()
Δύο πράγματα συνήθως πάει λάθος εδώ. Πρώτον, PageCollection είναι 1-βάση (doc.Pages()[1] είναι η πρώτη σελίδα) ενώ AnnotationCollection είναι 0-βάση (annots[0] είναι η πρώτη σημείωση) — η σύγχυση των δύο σχημάτων δεικτοδότησης οδηγεί σε λειτουργία στο λάθος αντικείμενο. Δεύτερον, βεβαιωθείτε ότι το Document::Save() εκτελείται πραγματικά μετά την προσθήκη της σημείωσης· τίποτα δεν γράφεται στο δίσκο μέχρι τότε.
AnnotationCollection ευρετηρίαση ή Delete(index) throws std::out_of_range
Οι έγκυροι δείκτες κυμαίνονται από το 0 έως το Count() - 1. Η παροχή ενός αρνητικού δείκτη ή ενός δείκτη ίσου ή μεγαλύτερου του Count() προκαλεί std::out_of_range επίτηδες. Καλέστε το Count() πρώτα για να περιορίσετε οποιονδήποτε βρόχο ή αναζήτηση.
Remove() returns false τη δεύτερη φορά που το καλώ στην ίδια σημείωση
Αυτό δεν είναι σφάλμα. Το Remove() αναφέρει αν η σημείωση βρέθηκε και αφαιρέθηκε ως bool; η επανεκτέλεση σε μια σημείωση που ήδη έχει αφαιρεθεί είναι πράξη χωρίς αποτέλεσμα που επιστρέφει false. Ελέγξτε την τιμή επιστροφής αντί να υποθέτετε ότι το Remove() επιτυγχάνει πάντα.
Ορισμός νέου AnnotationFlags η τιμή καθαρίζει τις σημαίες που είχα ήδη ορίσει
Flags(value) αντικαθιστά ολόκληρο το σύνολο σημαιών — δεν ενώνει με την προηγούμενη τιμή. Για να προσθέσετε ή να αφαιρέσετε μια μόνο σημαία, διαβάστε πρώτα τις τρέχουσες σημαίες και συνδυάστε τις με τελεστές bitwise, για παράδειγμα a.Flags(a.Flags() | AnnotationFlags::Print) για προσθήκη σημαίας, ή a.Flags(a.Flags() & ~AnnotationFlags::Print) για αφαίρεση μιας σημαίας ενώ αφήνετε τις υπόλοιπες ανέπαφες.
Συχνές Ερωτήσεις
Ποια είναι η σχέση μεταξύ Annotation, TextAnnotation και των άλλων υποτύπων annotation;
Annotation είναι η κοινή βασική κλάση. TextAnnotation και οι άλλοι συγκεκριμένοι τύποι annotation εξειδικεύουν αυτήν για ένα PDF annotation subtype, ενώ μοιράζονται τις μεθόδους πρόσβασης Rect(), Contents(), Color(), Flags() και Border() της βασικής κλάσης.
Οι annotations περιορίζονται σε ολόκληρο το έγγραφο ή σε μία σελίδα;
Κάθε σελίδα έχει το δικό της AnnotationCollection, το οποίο επιστρέφεται από τη μέθοδο Annotations() της σελίδας. Οι annotations είναι πάντα περιορισμένες στη σελίδα στην οποία προστέθηκαν, όχι σε όλο το έγγραφο.
Πώς μπορώ να μετρήσω πόσες annotations υπάρχουν σε μια σελίδα;
Καλέστε το Count() στο AnnotationCollection που επιστρέφεται από το Page::Annotations().
Μπορεί μια annotation να είναι ταυτόχρονα εκτυπώσιμη και μόνο για ανάγνωση;
Ναι. Το AnnotationFlags είναι πεδίο bit, έτσι συνδυάστε τιμές με λογικό OR, για παράδειγμα AnnotationFlags::Print | AnnotationFlags::ReadOnly.
Η διαγραφή μιας σημείωσης από το AnnotationCollection την αφαιρεί από το αρχείο PDF στο δίσκο;
Μόνο μετά την εκτέλεση του Document::Save(). Τα Delete(), Remove() και Clear() τροποποιούν μόνο τη συλλογή στη μνήμη — το PDF στο δίσκο παραμένει αμετάβλητο μέχρι να αποθηκευτεί το έγγραφο.