Introduzione
Le annotazioni PDF coprono un’ampia gamma di elementi interattivi e visivi sovrapposti al contenuto della pagina: note testuali adesive, collegamenti ipertestuali, testo evidenziato o barrato, forme geometriche, tratti di inchiostro, allegati di file e timbri di approvazione. Aspose.PDF FOSS per C++ rappresenta ciascuno di questi come una sottoclasse concreta di Annotation, in modo che il codice che percorre le annotazioni di una pagina possa lavorare in modo generico sulla classe base pur potendo accedere ai membri specifici del sottotipo — come Icon() su un TextAnnotation o Action() su un LinkAnnotation — quando necessario.
L’enumerazione Annotations::AnnotationType della libreria elenca i sottotipi che riconosce: 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 e diversi altri. Ogni valore è associato a una classe concreta — CircleAnnotation, SquareAnnotation, PolygonAnnotation, PolylineAnnotation e LineAnnotation per la marcatura di forme; FreeTextAnnotation e InkAnnotation per testo libero e tratti disegnati; FileAttachmentAnnotation, SoundAnnotation, MovieAnnotation, ScreenAnnotation e RichMediaAnnotation per contenuti incorporati; e WidgetAnnotation per le rappresentazioni dei campi AcroForm.
Questo articolo tratta le API di base Annotation e AnnotationCollection, aggiungendo note testuali e collegamenti, rilevando i tipi di annotazione durante il caricamento di un documento esistente e leggendo o aggiornando i metadati di marcatura e i timbri. Aspose.PDF FOSS per C++ è una libreria C++20 senza dipendenze runtime oltre alla libreria standard; le intestazioni sono incluse direttamente dalla directory aspose/pdf/annotations/ e la libreria viene compilata come target CMake.
Cosa è incluso
Annotazione e AnnotationCollection
Annotation è la classe base per ogni sottotipo di annotazione. Espone proprietà condivise: Rect() / Rect(value) per il rettangolo di delimitazione dell’annotazione, Contents() per il testo associato, Name(), Color(), Flags() (un bitmask AnnotationFlags — Print, Hidden, Invisible, NoZoom, ReadOnly e altri), Border(), Width() / Height(), AnnotationType() e PageIndex(). AnnotationCollection contiene le annotazioni su una singola pagina ed è accessibile tramite 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 espone inoltre Add(annotation), Add(annotation, considerRotation), Delete(index), Delete(annotation), Clear(), Remove(annotation), Contains(annotation) e IsReadOnly().
Note di testo con TextAnnotation
TextAnnotation rappresenta il familiare commento a forma di nota adesiva. Oltre ai membri base di Annotation, aggiunge Open() / Open(value) per controllare se la nota appare espansa, e Icon() / Icon(value) (un valore TextIcon come Note, Comment, Key, Help o Check) per scegliere il glifo dell’icona.
#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");
Collegamenti e azioni con LinkAnnotation
LinkAnnotation collega una regione cliccabile a una pagina. Viene costruito a partire dalla Page proprietaria e da un Rectangle, e il suo comportamento è impostato con Action(value) — qualsiasi sottoclasse di PdfAction, inclusi NamedAction (navigazione predefinita come PredefinedAction::LastPage), GoToAction, GoToURIAction o JavascriptAction. Destination() legge il target IAppointment del collegamento, e Highlighting() / Highlighting(value) imposta il HighlightingMode (None, Invert, Outline, Push, Toggle) applicato quando il collegamento viene attivato.
#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);
Rilevare i tipi di annotazione al caricamento
Quando un documento viene aperto, le annotazioni esistenti sono già popolate nella AnnotationCollection di ogni pagina, e AnnotationType() identifica quale sottotipo concreto rappresenta ciascuna voce. Questo consente al codice chiamante di effettuare un branching sul valore dell’enum senza conoscere in anticipo quali tipi di annotazione contiene un dato 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;
}
}
Metadati dell’annotazione markup
MarkupAnnotation è la base per le annotazioni che contengono metadati del revisore: Title() (l’autore), Subject(), RichText() per il testo del commento formattato e Opacity() per la trasparenza rispetto al contenuto della pagina. InReplyTo() e Popup() collegano un’annotazione di markup al thread di commenti a cui appartiene, e ClearState() / SetReviewState(state, userName) gestiscono il suo stato di revisione. HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation e SquigglyAnnotation sono sottotipi di markup posizionati sopra il testo; la loro base comune TextMarkupAnnotation aggiunge QuadPoints() per definire le regioni quadrilaterali coperte e GetMarkedText() per leggere il testo sottostante.
#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);
}
}
Annotazioni di timbro con StampAnnotation
StampAnnotation posiziona un timbro predefinito o personalizzato su una pagina. Icon() / Icon(value) seleziona un valore StampIcon — Approved, Draft, Confidential, Final, Expired, NotApproved, ForComment, TopSecret e altri — e Image() / Image(value) fornisce i byte dell’immagine grezza per un aspetto di timbro personalizzato invece di un’icona integrata.
#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);
}
}
Avvio rapido
Aggiungi la libreria come sottodirectory CMake e collega al target aspose_pdf_foss:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)
Apri un documento, aggiungi una nota di testo e leggi nuovamente il conteggio delle annotazioni:
#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";
}
Formati supportati
| Formato | Estensione | Leggi | Scrivi |
|---|---|---|---|
| BMP | .bmp | — | ✓ |
| JPEG | .jpg | — | ✓ |
| TIFF | .tiff | — | ✓ |
| Text | .txt | — | ✓ |
| SVG | .svg | ✓ | — |
Il supporto del formato si applica al rendering delle pagine e alle opzioni di caricamento a livello di documento; queste voci riflettono i percorsi di export confermati (BmpDevice, JpegDevice, TiffDevice, TextDevice) e di import (SvgLoadOptions) piuttosto che la serializzazione specifica delle annotazioni.
Open Source & Licenze
Aspose.PDF FOSS per C++ è rilasciato sotto licenza MIT. Il codice sorgente è disponibile su https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp, e la libreria può essere utilizzata in progetti commerciali e open-source senza costi di licenza.