Inleiding
PDF-annotaties bestrijken een breed scala aan interactieve en visuele elementen die bovenop de paginainhoud worden geplaatst: plakkende tekstnotities, hyperlinks, gemarkeerde of doorgestreepte tekst, geometrische vormen, inktstrepen, bestandsbijlagen en goedkeuringsstempels. Aspose.PDF FOSS voor C++ vertegenwoordigt elk van deze als een concrete subklasse van Annotation, zodat code die door de annotaties van een pagina loopt generiek tegen de basisklasse kan werken terwijl toch subtype-specifieke leden bereikbaar blijven — zoals Icon() op een TextAnnotation of Action() op een LinkAnnotation — wanneer nodig.
De Annotations::AnnotationType-enum van de bibliotheek somt de subtypes op die ze herkent: 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 en diverse anderen. Elke waarde wordt gekoppeld aan een concrete klasse — CircleAnnotation, SquareAnnotation, PolygonAnnotation, PolylineAnnotation en LineAnnotation voor vormmarkering; FreeTextAnnotation en InkAnnotation voor vrije-tekst en getekende streken; FileAttachmentAnnotation, SoundAnnotation, MovieAnnotation, ScreenAnnotation en RichMediaAnnotation voor ingebedde inhoud; en WidgetAnnotation voor AcroForm-veldweergaven.
Dit artikel behandelt de Annotation- en AnnotationCollection-basis API, het toevoegen van tekstnotities en koppelingen, het detecteren van annotatietypes bij het laden van een bestaand document, en het lezen of bijwerken van markup-metadata en stempels. Aspose.PDF FOSS voor C++ is een C++20-bibliotheek zonder runtime-afhankelijkheden buiten de standaardbibliotheek; headers worden rechtstreeks opgenomen vanuit de aspose/pdf/annotations/-map en de bibliotheek wordt gebouwd als een CMake-target.
Wat er inbegrepen is
Annotatie en AnnotationCollection
Annotation is de basisklasse voor elk annotatiesubtype. Het biedt gedeelde eigenschappen: Rect() / Rect(value) voor de begrenzende rechthoek van de annotatie, Contents() voor de bijbehorende tekst, Name(), Color(), Flags() (een AnnotationFlags-bitmasker — Print, Hidden, Invisible, NoZoom, ReadOnly en anderen), Border(), Width() / Height(), AnnotationType() en PageIndex(). AnnotationCollection bevat de annotaties op één pagina en is toegankelijk via 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 biedt ook Add(annotation), Add(annotation, considerRotation), Delete(index), Delete(annotation), Clear(), Remove(annotation), Contains(annotation) en IsReadOnly().
Tekstnotities met TextAnnotation
TextAnnotation vertegenwoordigt de bekende plaknotitie-commentaar. Naast de leden van de basisklasse Annotation voegt het Open() / Open(value) toe om te bepalen of de notitie uitgebreid wordt weergegeven, en Icon() / Icon(value) (een TextIcon-waarde zoals Note, Comment, Key, Help of Check) om het pictogram-glyph te kiezen.
#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");
Koppelingen en Acties met LinkAnnotation
LinkAnnotation voegt een klikbare regio toe aan een pagina. Het wordt geconstrueerd vanuit de eigenaar Page en een Rectangle, en het gedrag wordt ingesteld met Action(value) — elke PdfAction subklasse, inclusief NamedAction (voorgegeven navigatie zoals PredefinedAction::LastPage), GoToAction, GoToURIAction of JavascriptAction. Destination() leest het IAppointment-doel van de link, en Highlighting() / Highlighting(value) zet de HighlightingMode (None, Invert, Outline, Push, Toggle) die wordt toegepast wanneer de link wordt geactiveerd.
#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);
Detecteren van annotatietypen bij laden
Wanneer een document wordt geopend, zijn bestaande annotaties al geladen in de AnnotationCollection van elke pagina, en AnnotationType() identificeert welk concreet subtype elke invoer vertegenwoordigt. Dit stelt de aanroepende code in staat om te vertakken op basis van de enum-waarde zonder van tevoren te weten welke annotatietypen een gegeven PDF bevat.
#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;
}
}
Markup-annotatie-metadata
MarkupAnnotation is de basis voor annotaties die beoordelaar-metadata bevatten: Title() (de auteur), Subject(), RichText() voor opgemaakte commentaartekst, en Opacity() voor het mengen met de paginainhoud. InReplyTo() en Popup() verbinden een markup-annotatie met de commentaarthread waartoe deze behoort, en ClearState() / SetReviewState(state, userName) beheren de beoordelingsstatus. HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation en SquigglyAnnotation zijn markup-subtypes die over tekst worden geplaatst; hun gedeelde TextMarkupAnnotation-basis voegt QuadPoints() toe om de vierhoekige gebieden te definiëren die worden gedekt en GetMarkedText() om de onderliggende tekst terug te lezen.
#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);
}
}
Stempel-annotaties met StampAnnotation
StampAnnotation plaatst een voorgedefinieerde of aangepaste stempel op een pagina. Icon() / Icon(value) selecteert een StampIcon-waarde — Approved, Draft, Confidential, Final, Expired, NotApproved, ForComment, TopSecret en anderen — en Image() / Image(value) levert ruwe afbeeldingsbytes voor een aangepaste stempelweergave in plaats van een ingebouwd pictogram.
#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);
}
}
Snelstart
Voeg de bibliotheek toe als een CMake-subdirectory en link tegen het aspose_pdf_foss-target:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)
Open een document, voeg een tekstnotitie toe en lees het aantal annotaties terug:
#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";
}
Ondersteunde formaten
| Formaat | Extensie | Lezen | Schrijven |
|---|---|---|---|
| BMP | .bmp | — | ✓ |
| JPEG | .jpg | — | ✓ |
| TIFF | .tiff | — | ✓ |
| Text | .txt | — | ✓ |
| SVG | .svg | ✓ | — |
Formaatsupport is van toepassing op paginarendering en laadopties op documentniveau; deze items geven bevestigde export (BmpDevice, JpegDevice, TiffDevice, TextDevice) en import (SvgLoadOptions) paden weer, in plaats van annotatie-specifieke serialisatie.
Open source & licenties
Aspose.PDF FOSS voor C++ wordt uitgebracht onder de MIT-licentie. Broncode is beschikbaar op https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp, en de bibliotheek kan worden gebruikt in commerciële en open-sourceprojecten zonder licentiekosten.