Einleitung

PDF-Anmerkungen umfassen ein breites Spektrum interaktiver und visueller Elemente, die über dem Seiteninhalt liegen: klebende Textnotizen, Hyperlinks, hervorgehobener oder durchgestrichener Text, geometrische Formen, Tintenstriche, Dateianhänge und Genehmigungsstempel. Aspose.PDF FOSS für C++ stellt jedes davon als konkrete Unterklasse von Annotation dar, sodass Code, der die Anmerkungen einer Seite durchläuft, generisch gegen die Basisklasse arbeiten kann, aber trotzdem subtypenspezifische Mitglieder erreichen kann – wie Icon() bei einer TextAnnotation oder Action() bei einer LinkAnnotation – wenn nötig.

Das Annotations::AnnotationType-Enum der Bibliothek enumeriert die von ihr erkannten Subtypen: 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 und mehrere weitere. Jeder Wert wird einer konkreten Klasse zugeordnet – CircleAnnotation, SquareAnnotation, PolygonAnnotation, PolylineAnnotation und LineAnnotation für Form-Markup; FreeTextAnnotation und InkAnnotation für Freitext und gezeichnete Striche; FileAttachmentAnnotation, SoundAnnotation, MovieAnnotation, ScreenAnnotation und RichMediaAnnotation für eingebettete Inhalte; und WidgetAnnotation für AcroForm-Felddarstellungen.

Dieser Beitrag behandelt die Basis-API Annotation und AnnotationCollection, das Hinzufügen von Textnotizen und Links, das Erkennen von Anmerkungstypen beim Laden eines bestehenden Dokuments sowie das Lesen oder Aktualisieren von Markup-Metadaten und Stempeln. Aspose.PDF FOSS für C++ ist eine C++20-Bibliothek ohne Laufzeitabhängigkeiten jenseits der Standardbibliothek; Header werden direkt aus dem Verzeichnis aspose/pdf/annotations/ eingebunden und die Bibliothek wird als CMake-Target gebaut.


Was enthalten ist

Annotation und AnnotationCollection

Annotation ist die Basisklasse für jeden Anmerkungs-Subtyp. Sie stellt gemeinsame Eigenschaften bereit: Rect() / Rect(value) für das Begrenzungsrechteck der Anmerkung, Contents() für den zugehörigen Text, Name(), Color(), Flags() (eine AnnotationFlags-Bitmaske – Print, Hidden, Invisible, NoZoom, ReadOnly und weitere), Border(), Width() / Height(), AnnotationType() und PageIndex(). AnnotationCollection enthält die Anmerkungen einer einzelnen Seite und ist über Page.Annotations() zugänglich.

#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 stellt außerdem Add(annotation), Add(annotation, considerRotation), Delete(index), Delete(annotation), Clear(), Remove(annotation), Contains(annotation) und IsReadOnly() bereit.

Textnotizen mit TextAnnotation

TextAnnotation stellt den bekannten Klebezettel-Kommentar dar. Zusätzlich zu den Basis-Annotation-Mitgliedern fügt sie Open() / Open(value) hinzu, um zu steuern, ob die Notiz erweitert angezeigt wird, sowie Icon() / Icon(value) (ein TextIcon-Wert wie Note, Comment, Key, Help oder Check), um das Symbol-Glyph auszuwählen.

#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");

LinkAnnotation fügt einer Seite einen anklickbaren Bereich hinzu. Sie wird aus der zugehörigen Page und einem Rectangle konstruiert, und ihr Verhalten wird mit Action(value) festgelegt – jede Unterklasse von PdfAction, einschließlich NamedAction (vordefinierte Navigation wie PredefinedAction::LastPage), GoToAction, GoToURIAction oder JavascriptAction. Destination() liest das Ziel des Links IAppointment, und Highlighting() / Highlighting(value) setzt den HighlightingMode (None, Invert, Outline, Push, Toggle), der angewendet wird, wenn der Link aktiviert wird.

#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);

Erkennen von Anmerkungstypen beim Laden

Wenn ein Dokument geöffnet wird, sind die vorhandenen Anmerkungen bereits in der AnnotationCollection jeder Seite gefüllt, und AnnotationType() ermittelt, welchen konkreten Subtyp jeder Eintrag darstellt. Dadurch kann der Aufrufcode anhand des Enum-Werts verzweigen, ohne im Voraus zu wissen, welche Anmerkungstypen ein gegebenes PDF enthält.

#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-Anmerkungs-Metadaten

MarkupAnnotation ist die Basis für Anmerkungen, die Reviewer-Metadaten tragen: Title() (der Autor), Subject(), RichText() für formatierten Kommentartext und Opacity() für die Überblendung mit dem Seiteninhalt. InReplyTo() und Popup() verbinden eine Markup-Annotation mit dem Kommentar-Thread, zu dem sie gehört, und ClearState() / SetReviewState(state, userName) verwalten ihren Review-Status. HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation und SquigglyAnnotation sind Markup-Subtypen, die über Text positioniert werden; ihr gemeinsamer TextMarkupAnnotation-Basis fügt QuadPoints() hinzu, um die abgedeckten Viereckregionen zu definieren, und GetMarkedText() zum Auslesen des darunterliegenden Textes.

#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-Anmerkungen mit StampAnnotation

StampAnnotation platziert einen vordefinierten oder benutzerdefinierten Stempel auf einer Seite. Icon() / Icon(value) wählt einen StampIcon-Wert – Approved, Draft, Confidential, Final, Expired, NotApproved, ForComment, TopSecret und weitere – und Image() / Image(value) liefert rohe Bildbytes für das Aussehen eines benutzerdefinierten Stempels anstelle eines integrierten Icons.

#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);
    }
}

Schnellstart

Fügen Sie die Bibliothek als CMake-Unterverzeichnis hinzu und linken Sie gegen das Ziel aspose_pdf_foss:

add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)

Öffnen Sie ein Dokument, fügen Sie eine Textnotiz hinzu und lesen Sie die Anmerkungsanzahl zurück:

#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";
}

Unterstützte Formate

FormatErweiterungLesenSchreiben
BMP.bmp
JPEG.jpg
TIFF.tiff
Text.txt
SVG.svg

Die Formatunterstützung gilt für die Seitenrenderung und Ladeoptionen auf Dokumentebene; diese Einträge spiegeln bestätigte Export-(BmpDevice, JpegDevice, TiffDevice, TextDevice)- und Import-(SvgLoadOptions)-Pfade wider, anstatt einer annotation-spezifischen Serialisierung.


Open Source & Lizenzierung

Aspose.PDF FOSS für C++ wird unter der MIT-Lizenz veröffentlicht. Der Quellcode ist unter https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp verfügbar, und die Bibliothek kann in kommerziellen und Open-Source-Projekten ohne Lizenzgebühren verwendet werden.


Erste Schritte

Verwandte Ressourcen