Lucrul cu adnotările PDF
Lucrul cu adnotări PDF
Adnotările PDF în Aspose.PDF FOSS pentru C++ sunt reprezentate de clasa de bază Annotation și subtipurile sale concrete (TextAnnotation, LinkAnnotation, HighlightAnnotation, FreeTextAnnotation, CircleAnnotation, WatermarkAnnotation, WidgetAnnotation și altele). Fiecare pagină expune adnotările prin Page.Annotations(), care returnează un AnnotationCollection. Acest ghid acoperă adăugarea de adnotări pe o pagină, iterarea și eliminarea acestora, citirea adnotărilor dintr-un document existent, atașarea acțiunilor de link, personalizarea aspectului și aplatizarea adnotărilor.
Adăugarea de adnotări pe o pagină
Creează o instanță concretă de adnotare, poziționeaz-o cu un Rectangle și adaug-o la colecția paginii cu AnnotationCollection.Add(). TextAnnotation reprezintă un comentariu de tip notiță lipicioasă ancorat la un punct pe pagină:
#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) obțin și setează textul notiței, iar Annotation.Rect() / Rect(value) poziționează adnotarea pe pagină.
Iterarea și eliminarea adnotărilor
AnnotationCollection suportă numărarea, accesul indexat, verificările de apartenență și eliminarea prin valoare sau prin index:
#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) și Remove(annotation) operează pe o referință de adnotare specifică; Delete(index) elimină prin poziție, iar Delete(annotation) elimină o adnotare specifică fără a-i necesita indexul. IsReadOnly() raportează dacă colecția poate fi modificată.
Citirea adnotărilor dintr-un document existent
Când un document este încărcat, adnotările sale sunt deja populate și pot fi inspectate fără a adăuga nimic. Annotation.AnnotationType() raportează subtipul (AnnotationType::Text, AnnotationType::Highlight, AnnotationType::Link, AnnotationType::FreeText, AnnotationType::FileAttachment, AnnotationType::Watermark și altele):
#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";
}
}
}Ordinea adnotărilor și subtipul sunt păstrate pe parcursul unui ciclu de salvare/reîncărcare, astfel încât codul care indexează în Annotations() după încărcarea unui document vede aceeași secvență care era prezentă când fișierul a fost scris.
Adnotări de tip link și acțiuni
LinkAnnotation atașează o regiune clicabilă la o pagină și declanșează un PdfAction când este activat. NamedAction sare la o țintă de navigare predefinită, JavascriptAction execută un șir ECMAScript, iar SubmitFormAction trimite date de formular către un URL printr-un 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) acceptă orice subtip PdfAction și îl clonează intern, astfel încât adnotarea păstrează propria copie a acțiunii. LinkAnnotation.Destination() / Destination(value) setează o țintă de navigare explicită în loc de o acțiune, iar Highlighting() / Highlighting(value) controlează feedback-ul vizual afișat în timp ce linkul este apăsat.
Aspectul adnotării: bordură, flaguri și culoare
Fiecare Annotation expune un Border, un bitfield de AnnotationFlags, și un Color folosit pentru a reda aspectul său:
#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() acceptă BorderStyle::Solid, Dashed, Beveled, Inset sau Underline. Border.Effect() suportă, de asemenea, un contur BorderEffect::Cloudy cu EffectIntensity() care controlează cât de pronunțat este. AnnotationFlags este un bitfield — combinați valori precum Print, NoZoom, ReadOnly și LockedContents pentru a controla cum se comportă o adnotare într-un vizualizator fără a schimba conținutul său vizibil.
Aplatizarea adnotărilor
O singură adnotare poate fi aplatizată — fuzionată în conținutul paginii și făcută neinteractivă — prin apelarea directă a 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");
}Pentru operațiuni de adnotare la nivel de document, PdfAnnotationEditor urmează modelul Facade partajat utilizat în API: legați un document sursă cu BindPdf(), aplicați una sau mai multe operațiuni de adnotare, apoi scrieți rezultatul cu 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() elimină fiecare adnotare din documentul legat; DeleteAnnotations(annotType) restricționează eliminarea la o singură AnnotationType. ImportAnnotationsFromXfdf(xfdfFile) și ImportAnnotationsFromFdf(fdfFile) încarcă date de adnotare exportate dintr-un alt vizualizator PDF.
Sfaturi și bune practici
- Adăugați întotdeauna o adnotare nou construită la
Page.Annotations()înainte de a apelaDocument.Save()— o adnotare care nu este niciodată adăugată la o colecție nu este scrisă în fișierul de ieșire. - Utilizați
AnnotationCollection.Contains(annotation)înainte de a apelaRemove()dacă nu sunteți sigur că adnotarea este încă prezentă;Remove()returneazăfalseîn loc să arunce o excepție când adnotarea lipsește. - Verificați
Annotation.AnnotationType()înainte de a face casting sau ramificare pe comportamentul subtipului când iterați adnotările încărcate dintr-un fișier PDF neîncrezător sau de la terți. - Aplatizați adnotările cu
Annotation.Flatten()(sauPdfAnnotationEditor.FlatteningAnnotations()pentru întregul document) înainte de a arhiva un document, astfel încât recenzenții din alte instrumente să vadă aceeași prezentare pe care ați creat-o. AnnotationFlagseste un bitfield — combinați steagurile cu valorile întregi de bază ale enumului în loc să presupuneți că doar un singur steag poate fi activ simultan.
Probleme comune
| Problemă | Cauză | Remediere |
|---|---|---|
| Adnotarea nu este vizibilă după salvare | Adnotarea a fost construită, dar nu a fost adăugată niciodată la Page.Annotations() | Apelă page.Annotations().Add(annotation) înainte de doc.Save() |
Remove() returnează false | Referința adnotării furnizate nu corespunde niciunei intrări din colecție în prezent | Folosește mai întâi Contains(), sau elimină prin index cu Delete(index) |
| Tip de adnotare greșit după reîncărcare | Codul a presupus un subtip specific fără a verifica AnnotationType() | Ramifică pe Annotation.AnnotationType() înainte de a trata obiectul ca pe un subtip specific |
| Acțiunea de legătură pare nesetată după atribuire | Un PdfAction local a ieșit din scop; LinkAnnotation.Action() returnează copia clonată a adnotării, nu obiectul original | Citește acțiunea înapoi prin link.Action() în loc să păstrezi variabila locală originală |
Operația PdfAnnotationEditor nu are efect | BindPdf() nu a fost apelat, sau a fost apelat cu o cale care nu există | Confirmați că BindPdf() reușește înainte de a apela FlatteningAnnotations() sau DeleteAnnotations() |
FAQ
Cum pot adăuga o adnotare de tip comentariu pe o pagină PDF?
Construiți un TextAnnotation cu ținta Document, setați-i Rect() și Contents(), apoi adăugați-l la page.Annotations() înainte de salvare.
Cum pot afla ce tip de adnotare privesc?
Apelă Annotation.AnnotationType(), care returnează o valoare enum AnnotationType cum ar fi Text, Link, Highlight, FreeText, FileAttachment sau Watermark.
Poate o adnotare să conțină mai multe steaguri?
Da. AnnotationFlags este un bitfield (Default, Invisible, Hidden, Print, NoZoom, ReadOnly, LockedContents și altele), astfel încât mai multe flaguri pot fi combinate într-o singură adnotare.
Care este diferența dintre a aplatiza o adnotare și a aplatiza un document?
Annotation.Flatten() îmbină o singură adnotare în conținutul paginii sale. PdfAnnotationEditor.FlatteningAnnotations() (opțional limitat prin interval de pagini și AnnotationType prin suprasarcina care acceptă start, end și annotType) aplatizează întregul document legat într-un singur apel.
Cum pot elimina toate adnotările de un anumit tip dintr-un document?
Leagă documentul cu PdfAnnotationEditor.BindPdf(), apelează DeleteAnnotations(annotType) cu AnnotationType țintă, apoi Save() rezultatul.
API Reference Rezumat
| Clasă/Metodă | Descriere: |
|---|---|
Annotation | Clasă de bază abstractă pentru toate subtipurile de adnotări PDF |
Annotation.Rect() / Rect(value) | Obțineți sau setați dreptunghiul de delimitare al adnotării |
Annotation.Contents() / Contents(value) | Obțineți sau setați conținutul text al adnotării |
Annotation.AnnotationType() | Returnează valoarea enum AnnotationType pentru această adnotare |
Annotation.Flags() / Flags(value) | Obține sau setează câmpul de biți AnnotationFlags |
Annotation.Border() / Border(value) | Obțineți sau setați Border al adnotării |
Annotation.Color() / Color(value) | Obține sau setează afișajul adnotării Color |
Annotation.Flatten() | Îmbină această adnotare în conținutul paginii, făcând-o neinteractivă |
AnnotationCollection | Colecție ordonată de adnotări pe o pagină, returnată de Page.Annotations() |
AnnotationCollection.Add(annotation) / Add(annotation, considerRotation) | Adaugă o adnotare la colecție |
AnnotationCollection.Count() | Returnează numărul de adnotări din colecție |
AnnotationCollection.Contains(annotation) | Raportează dacă colecția conține adnotarea dată |
AnnotationCollection.Remove(annotation) | Elimină o adnotare specifică; returnează false dacă nu este găsită |
AnnotationCollection.Delete(index) / Delete(annotation) | Elimină o adnotare după index sau prin referință |
AnnotationCollection.Clear() | Elimină toate adnotările din colecție |
TextAnnotation | Adnotare în stilul notiței adezive cu Open() și Icon() (TextIcon) |
LinkAnnotation | Regiune clicabilă care expediază un PdfAction prin Action() / Action(value) |
LinkAnnotation.Destination() / Destination(value) | Obține sau setează o destinație de navigare explicită |
HighlightAnnotation | Marchează un fragment de text cu o culoare de evidențiere |
FreeTextAnnotation | Afișează un text de tip callout; configurat prin Justification(), DefaultAppearanceObject(), Callout() |
CircleAnnotation | Desenează o elipsă în interiorul dreptunghiului adnotării |
WatermarkAnnotation | Adnotare suprapusă cu un accesor Opacity() / Opacity(value) |
WidgetAnnotation | Adnotare de aspect a câmpului de formular cu ReadOnly(), Required(), Exportable(), DefaultAppearance() |
NamedAction | Acțiune de navigare predefinită (PredefinedAction enum) atașabilă unui LinkAnnotation |
JavascriptAction | Rulează un șir ECMAScript prin Script() / GetECMAScriptString() |
SubmitFormAction | Trimite date de formular la un URL FileSpecification prin Url() / Url(value) |
Border | Marginea adnotării cu Width(), Style() (BorderStyle), Effect() (BorderEffect) |
PdfAnnotationEditor | Fațadă pentru importul, modificarea, aplatizarea și ștergerea adnotărilor la nivel de document |
PdfAnnotationEditor.FlatteningAnnotations() | Aplatizează adnotările în documentul legat |
PdfAnnotationEditor.DeleteAnnotations(annotType) | Șterge toate adnotările unui anumit AnnotationType |
PdfAnnotationEditor.ImportAnnotationsFromXfdf(xfdfFile) | Importă adnotări dintr-un fișier XFDF |