Introducere
Adnotările PDF acoperă o gamă largă de elemente interactive și vizuale suprapuse peste conținutul paginii: note textuale lipicioase, hyperlink-uri, text evidențiat sau tăiat, forme geometrice, linii de cerneală, atașamente de fișiere și ștampile de aprobare. Aspose.PDF FOSS pentru C++ reprezintă fiecare dintre acestea ca o subclasă concretă a Annotation, astfel încât codul care parcurge adnotările unei pagini poate lucra generic pe clasa de bază, dar poate accesa și membri specifici subtipului — cum ar fi Icon() pe un TextAnnotation sau Action() pe un LinkAnnotation — atunci când este necesar.
Enumul Annotations::AnnotationType al bibliotecii enumeratează subtipurile pe care le recunoaște: 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 și altele. Fiecare valoare se mapă la o clasă concretă — CircleAnnotation, SquareAnnotation, PolygonAnnotation, PolylineAnnotation și LineAnnotation pentru markup de forme; FreeTextAnnotation și InkAnnotation pentru text liber și linii desenate; FileAttachmentAnnotation, SoundAnnotation, MovieAnnotation, ScreenAnnotation și RichMediaAnnotation pentru conținut încorporat; și WidgetAnnotation pentru aspectele câmpurilor AcroForm.
Acest articol acoperă bazele API ale Annotation și AnnotationCollection, adăugarea notelor text și a linkurilor, detectarea tipurilor de adnotări la încărcarea unui document existent și citirea sau actualizarea metadatelor de markup și a ștampilelor. Aspose.PDF FOSS pentru C++ este o bibliotecă C++20 fără dependențe la runtime în afara bibliotecii standard; antetele sunt incluse direct din directorul aspose/pdf/annotations/ și biblioteca este construită ca o țintă CMake.
Ce este inclus
Adnotare și Colecție de Adnotări
Annotation este clasa de bază pentru fiecare subtip de adnotare. Expune proprietăți comune: Rect() / Rect(value) pentru dreptunghiul delimitator al adnotării, Contents() pentru textul asociat, Name(), Color(), Flags() (un bitmask AnnotationFlags — Print, Hidden, Invisible, NoZoom, ReadOnly și altele), Border(), Width() / Height(), AnnotationType() și PageIndex(). AnnotationCollection conține adnotările de pe o singură pagină și este accesată prin 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 expune, de asemenea, Add(annotation), Add(annotation, considerRotation), Delete(index), Delete(annotation), Clear(), Remove(annotation), Contains(annotation) și IsReadOnly().
Note text cu TextAnnotation
TextAnnotation reprezintă comentariul familiar de tip notă lipicioasă. Dincolo de membrii de bază ai Annotation, adaugă Open() / Open(value) pentru a controla dacă nota apare extinsă și Icon() / Icon(value) (o valoare TextIcon precum Note, Comment, Key, Help sau Check) pentru a alege glifa pictogramei.
#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");
Legături și acțiuni cu LinkAnnotation
LinkAnnotation atașează o regiune clicabilă unei pagini. Este construit din Page-ul proprietar și un Rectangle, iar comportamentul său este setat cu Action(value) — orice subclasă PdfAction, inclusiv NamedAction (navigare predefinită precum PredefinedAction::LastPage), GoToAction, GoToURIAction sau JavascriptAction. Destination() citește ținta IAppointment a link-ului, și Highlighting() / Highlighting(value) setează HighlightingMode (None, Invert, Outline, Push, Toggle) aplicat când link-ul este activat.
#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);
Detectarea tipurilor de adnotări la încărcare
Când un document este deschis, adnotările existente sunt deja populate în AnnotationCollection-ul fiecărei pagini, și AnnotationType() identifică ce subtip concret reprezintă fiecare intrare. Acest lucru permite codului apelant să ramifice pe baza valorii enum fără să știe în prealabil ce tipuri de adnotări conține un PDF dat.
#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;
}
}
Metadate adnotare markup
MarkupAnnotation este baza pentru adnotările care conțin metadate ale revizorului: Title() (autorul), Subject(), RichText() pentru text de comentariu formatat și Opacity() pentru amestecarea cu conținutul paginii. InReplyTo() și Popup() leagă o adnotare markup de firul de comentarii căruia îi aparține, iar ClearState() / SetReviewState(state, userName) gestionează starea reviziei sale. HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation și SquigglyAnnotation sunt subtipuri markup poziționate peste text; baza lor comună TextMarkupAnnotation adaugă QuadPoints() pentru a defini regiunile cvadrilaterale acoperite și GetMarkedText() pentru a citi textul de dedesubt.
#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);
}
}
Adnotări tip ștampilă cu StampAnnotation
StampAnnotation plasează o ștampilă predefinită sau personalizată pe o pagină. Icon() / Icon(value) selectează o valoare StampIcon — Approved, Draft, Confidential, Final, Expired, NotApproved, ForComment, TopSecret și altele — și Image() / Image(value) furnizează octeți de imagine brute pentru o aparență de ștampilă personalizată în locul unei pictograme încorporate.
#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);
}
}
Pornire rapidă
Adăugați biblioteca ca subdirector CMake și legați-vă de ținta aspose_pdf_foss target:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)
Deschideți un document, adăugați o notă text și citiți din nou numărul de adnotări:
#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";
}
Formate suportate
| Format | Extensie | Citește | Scrie |
|---|---|---|---|
| BMP | .bmp | — | ✓ |
| JPEG | .jpg | — | ✓ |
| TIFF | .tiff | — | ✓ |
| Text | .txt | — | ✓ |
| SVG | .svg | ✓ | — |
Suportul pentru format se aplică la redarea paginii și la opțiunile de încărcare la nivel de document; aceste intrări reflectă căile de export confirmate (BmpDevice, JpegDevice, TiffDevice, TextDevice) și de import (SvgLoadOptions) mai degrabă decât serializarea specifică adnotărilor.
Open Source și Licențiere
Aspose.PDF FOSS pentru C++ este lansat sub licența MIT. Codul sursă este disponibil la https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp, iar biblioteca poate fi utilizată în proiecte comerciale și open-source fără taxe de licențiere.