Hoe te werken met PDF-annotaties in C++
Aspose.PDF FOSS voor C++ vertegenwoordigt elke PDF-annotatie als een subklasse van de gemeenschappelijke Annotation basisklasse, en maakt de annotaties op een pagina beschikbaar via de AnnotationCollection die wordt geretourneerd door Page::Annotations(). Deze gids voegt een platte tekstnotitie-annotatie en een gestylede annotatie toe aan een pagina met TextAnnotation, slaat het document op, opent het vervolgens opnieuw om de annotaties terug te lezen en één te verwijderen. De bibliotheek is geïntegreerd in een CMake-project als een subdirectory-afhankelijkheid — er is geen installatie-stap via een pakketregister.
Stapsgewijze handleiding
Stap 1: Installeer het pakket
Voeg de bibliotheek toe als een CMake-subdirectory en link het statische bibliotheek-target:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)Verifieer dat de toolchain en linkstap correct worden opgelost met een minimaal programma:
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc;
std::cout << "Linked OK — pages: " << doc.Pages().Count() << "\n";
}Een succesvolle build die pages: 0 afdrukt bevestigt dat de bibliotheek is gelinkt.
Stap 2: Vereiste klassen importeren
#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;Stap 3: Maak een document aan en voeg een pagina toe
Maak een nieuw document aan en voeg er een pagina aan toe. PageCollection::Add() retourneert de nieuw toegevoegde Page:
Document doc;
Page page = doc.Pages().Add();Stap 4: Voeg een tekstannotatie toe aan de pagina
TextAnnotation wordt weergegeven als een plaknotitie-achtige commentaar. Maak het aan vanuit de bezitende Document, stel de positie in met Rect() en het bericht met Contents(), en voeg het vervolgens toe aan de AnnotationCollection van de pagina:
TextAnnotation note{doc};
note.Rect(Rectangle(100.0, 700.0, 200.0, 720.0, false));
note.Contents("Reviewed and approved.");
page.Annotations().Add(note);Stap 5: Stijl een tweede annotatie met kleur, een rand en vlaggen
Annotation biedt ook Color(), Border() en Flags(). Flags() neemt een AnnotationFlags bitveld — combineer waarden met bitwise OR om meer dan één vlag tegelijk in te stellen:
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);Stap 6: Sla het document op
Niets wordt naar schijf geschreven totdat Save() wordt uitgevoerd:
doc.Save("annotated.pdf");Stap 7: Open de PDF opnieuw en lees de annotaties
Open het opgeslagen bestand opnieuw en lees de AnnotationCollection van de eerste pagina terug. AnnotationCollection is 0-gebaseerd, en Count() meldt hoeveel annotaties de pagina bevat:
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";
}
}Stap 8: Verwijder een annotatie en sla opnieuw op
AnnotationCollection::Delete(index) verwijdert een annotatie op basis van zijn 0-gebaseerde positie. Verwijder de eerste annotatie en sla het resultaat op in een nieuw bestand:
annots.Delete(0);
reopened.Save("annotated-cleaned.pdf");Veelvoorkomende problemen en oplossingen
Er verandert niets in de opgeslagen PDF na het aanroepen Annotations().Add()
Twee dingen gaan hier vaak fout. Ten eerste is PageCollection 1-gebaseerd (doc.Pages()[1] is de eerste pagina) terwijl AnnotationCollection 0-gebaseerd is (annots[0] is de eerste annotatie) — verwarring tussen de twee indexeringsschema’s leidt tot bewerking van het verkeerde object. Ten tweede, controleer of Document::Save() daadwerkelijk wordt uitgevoerd nadat de annotatie is toegevoegd; er wordt niets naar schijf geschreven tot dat moment.
AnnotationCollection indexeren of Delete(index) throws std::out_of_range
Geldige indexen lopen van 0 tot Count() - 1. Het doorgeven van een negatieve index of een index die gelijk is aan of groter dan Count() werpt std::out_of_range opzettelijk. Roep eerst Count() aan om elke lus of opzoeking te begrenzen.
Remove() returns false de tweede keer dat ik het aanroep op dezelfde annotatie
Dit is geen fout. Remove() rapporteert of de annotatie is gevonden en verwijderd als een bool; het opnieuw aanroepen op een annotatie die al verdwenen is, doet niets en retourneert false. Controleer de retourwaarde in plaats van aan te nemen dat Remove() altijd slaagt.
Een nieuwe instellen AnnotationFlags waarde wist vlaggen die ik al had ingesteld
Flags(value) vervangt de volledige vlagset — het voegt zich niet samen met de vorige waarde. Om een enkele vlag toe te voegen of te wissen, lees je eerst de huidige vlaggen en combineer je ze met bitwise-operatoren, bijvoorbeeld a.Flags(a.Flags() | AnnotationFlags::Print) om een vlag toe te voegen, of a.Flags(a.Flags() & ~AnnotationFlags::Print) om een vlag te wissen terwijl de rest onaangeroerd blijft.
Veelgestelde vragen
Wat is de relatie tussen Annotation, TextAnnotation en de andere annotatie-subtypen?
Annotation is de gemeenschappelijke basisklasse. TextAnnotation en de andere concrete annotatietypen specialiseren elk voor één PDF-annotatie-subtype, terwijl ze de accessors Rect(), Contents(), Color(), Flags() en Border() van de basisklasse delen.
Zijn annotaties van toepassing op het hele document of op één pagina?
Elke pagina heeft zijn eigen AnnotationCollection, geretourneerd door de Annotations()-methode van die pagina. Annotaties zijn altijd scoped aan de pagina waaraan ze zijn toegevoegd, niet aan het document als geheel.
Hoe tel ik hoeveel annotaties er op een pagina staan?
Roep Count() aan op de AnnotationCollection die wordt geretourneerd door Page::Annotations().
Kan een annotatie tegelijkertijd zowel afdrukbaar als alleen-lezen zijn?
Ja. AnnotationFlags is een bitveld, dus combineer waarden met bitwise OR, bijvoorbeeld AnnotationFlags::Print | AnnotationFlags::ReadOnly.
Verwijdert het verwijderen van een annotatie uit AnnotationCollection deze uit het PDF-bestand op schijf?
Alleen nadat Document::Save() wordt uitgevoerd. Delete(), Remove() en Clear() wijzigen alleen de in-memory-collectie — de PDF op schijf blijft ongewijzigd totdat het document wordt opgeslagen.