Arbeiten mit PDF-Anmerkungen

Arbeiten mit PDF-Anmerkungen

Arbeiten mit PDF-Anmerkungen

PDF-Anmerkungen in Aspose.PDF FOSS für C++ werden durch die Basisklasse Annotation und ihre konkreten Untertypen (TextAnnotation, LinkAnnotation, HighlightAnnotation, FreeTextAnnotation, CircleAnnotation, WatermarkAnnotation, WidgetAnnotation und weitere) repräsentiert. Jede Seite stellt ihre Anmerkungen über Page.Annotations() bereit, das ein AnnotationCollection zurückgibt. Dieser Leitfaden behandelt das Hinzufügen von Anmerkungen zu einer Seite, das Durchlaufen und Entfernen, das Lesen von Anmerkungen aus einem bestehenden Dokument, das Anfügen von Linkaktionen, das Anpassen des Erscheinungsbildes und das Flachlegen von Anmerkungen.


Hinzufügen von Anmerkungen zu einer Seite

Erstellen Sie eine konkrete Anmerkungsinstanz, positionieren Sie sie mit einem Rectangle und fügen Sie sie der Seitensammlung mit AnnotationCollection.Add() hinzu. TextAnnotation stellt einen klebezettelartigen Kommentar dar, der an einem Punkt auf der Seite verankert ist:

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>
#include <aspose/pdf/rectangle.hpp>

int main() {
    Aspose::Pdf::Document doc("input.pdf");
    auto& page = doc.Pages()[1];

    Aspose::Pdf::Annotations::TextAnnotation note(doc);
    note.Rect(Aspose::Pdf::Rectangle(100.0, 700.0, 200.0, 720.0, false));
    note.Contents("Reviewed and approved");

    page.Annotations().Add(note);
    doc.Save("annotated.pdf");
}

Annotation.Contents() / Contents(value) lesen und setzen den Notiztext, und Annotation.Rect() / Rect(value) positionieren die Anmerkung auf der Seite.


Durchlaufen und Entfernen von Anmerkungen

AnnotationCollection unterstützt Zählen, indizierten Zugriff, Mitgliedschaftsprüfungen und das Entfernen nach Wert oder nach Index:

#include <aspose/pdf/document.hpp>

int main() {
    Aspose::Pdf::Document doc("input.pdf");
    auto& annotations = doc.Pages()[1].Annotations();

    std::cout << "Annotation count: " << annotations.Count() << "\n";

    for (int i = 0; i < annotations.Count(); ++i) {
        std::cout << "Contents: " << annotations[i].Contents() << "\n";
    }

    if (annotations.Count() > 0) {
        annotations.Delete(0);   // remove by index
    }
    annotations.Clear();         // remove everything
}

AnnotationCollection.Contains(annotation) und Remove(annotation) arbeiten mit einer bestimmten Annotationsreferenz; Delete(index) entfernt nach Position und Delete(annotation) entfernt eine bestimmte Annotation, ohne ihren Index zu benötigen. IsReadOnly() gibt an, ob die Sammlung modifiziert werden kann.


Anmerkungen aus einem bestehenden Dokument lesen

Wenn ein Dokument geladen wird, sind seine Anmerkungen bereits befüllt und können ohne Hinzufügen von etwas inspiziert werden. Annotation.AnnotationType() gibt den Subtyp an (AnnotationType::Text, AnnotationType::Highlight, AnnotationType::Link, AnnotationType::FreeText, AnnotationType::FileAttachment, AnnotationType::Watermark und weitere):

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/annotation_type.hpp>

int main() {
    Aspose::Pdf::Document doc("annotated.pdf");
    auto& annotations = doc.Pages()[1].Annotations();

    for (int i = 0; i < annotations.Count(); ++i) {
        auto& a = annotations[i];
        if (a.AnnotationType() == Aspose::Pdf::Annotations::AnnotationType::Text) {
            std::cout << "Note: " << a.Contents() << "\n";
        }
    }
}

Die Reihenfolge und der Subtyp von Anmerkungen bleiben über einen Speicher-/Lade-Durchlauf erhalten, sodass Code, der nach dem Laden eines Dokuments in Annotations() indiziert, dieselbe Sequenz sieht, die beim Schreiben der Datei vorhanden war.


Link-Anmerkungen und Aktionen

LinkAnnotation fügt einer Seite einen anklickbaren Bereich hinzu und löst beim Aktivieren ein PdfAction aus. NamedAction springt zu einem vordefinierten Navigationsziel, JavascriptAction führt eine ECMAScript-Zeichenkette aus, und SubmitFormAction sendet Formulardaten an eine URL über ein FileSpecification:

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/link_annotation.hpp>
#include <aspose/pdf/annotations/named_action.hpp>
#include <aspose/pdf/annotations/predefined_action.hpp>
#include <aspose/pdf/rectangle.hpp>

int main() {
    Aspose::Pdf::Document doc;
    auto page = doc.Pages().Add();

    Aspose::Pdf::Annotations::LinkAnnotation link(
        page, Aspose::Pdf::Rectangle(0.0, 0.0, 100.0, 20.0, false));
    link.Action(Aspose::Pdf::Annotations::NamedAction(
        Aspose::Pdf::Annotations::PredefinedAction::LastPage));

    page.Annotations().Add(link);
    doc.Save("linked.pdf");
}

LinkAnnotation.Action(value) akzeptiert jeden PdfAction-Subtyp und klont ihn intern, sodass die Anmerkung ihre eigene Kopie der Aktion behält. LinkAnnotation.Destination() / Destination(value) setzen ein explizites Navigationsziel anstelle einer Aktion, und Highlighting() / Highlighting(value) steuern das visuelle Feedback, das beim Klicken auf den Link angezeigt wird.


Darstellung von Anmerkungen: Rahmen, Flags und Farbe

Jedes Annotation stellt ein Border, ein Bitfeld von AnnotationFlags, und ein Color zur Darstellung seines Erscheinungsbildes bereit:

#include <aspose/pdf/annotations/border_style.hpp>
#include <aspose/pdf/annotations/annotation_flags.hpp>
#include <aspose/pdf/color.hpp>

// 'note' is an existing Annotation reference, e.g. from AnnotationCollection.
note.Border().Width(2);
note.Border().Style(Aspose::Pdf::Annotations::BorderStyle::Dashed);
note.Flags(Aspose::Pdf::Annotations::AnnotationFlags::Print);
note.Color(Aspose::Pdf::Color::Red());

Border.Style() akzeptiert BorderStyle::Solid, Dashed, Beveled, Inset oder Underline. Border.Effect() unterstützt zusätzlich eine BorderEffect::Cloudy-Kontur mit EffectIntensity(), das steuert, wie ausgeprägt sie ist. AnnotationFlags ist ein Bitfeld – kombinieren Sie Werte wie Print, NoZoom, ReadOnly und LockedContents, um zu steuern, wie sich eine Anmerkung in einem Betrachter verhält, ohne ihren sichtbaren Inhalt zu ändern.


Flachlegen von Anmerkungen

Eine einzelne Anmerkung kann flachgelegt – in den Seiteninhalt integriert und nicht interaktiv gemacht – werden, indem Annotation.Flatten() direkt aufgerufen wird:

#include <aspose/pdf/document.hpp>

int main() {
    Aspose::Pdf::Document doc("annotated.pdf");
    auto& annotations = doc.Pages()[1].Annotations();
    for (int i = 0; i < annotations.Count(); ++i) {
        annotations[i].Flatten();
    }
    doc.Save("flattened.pdf");
}

Für dokumentweite Anmerkungsoperationen folgt PdfAnnotationEditor dem gemeinsamen Facade-Muster, das im gesamten API verwendet wird: Binden Sie ein Quelldokument mit BindPdf(), führen Sie ein oder mehrere Anmerkungsoperationen aus und schreiben Sie das Ergebnis mit Save():

#include <aspose/pdf/facades/pdf_annotation_editor.hpp>

int main() {
    Aspose::Pdf::Facades::PdfAnnotationEditor editor;
    editor.BindPdf("annotated.pdf");
    editor.FlatteningAnnotations();
    editor.Save("flattened.pdf");
}

PdfAnnotationEditor.DeleteAnnotations() entfernt jede Anmerkung aus dem gebundenen Dokument; DeleteAnnotations(annotType) beschränkt das Entfernen auf eine einzelne AnnotationType. ImportAnnotationsFromXfdf(xfdfFile) und ImportAnnotationsFromFdf(fdfFile) laden Anmerkungsdaten, die von einem anderen PDF-Betrachter exportiert wurden.


Tipps und bewährte Verfahren

  • Fügen Sie immer eine neu erstellte Anmerkung zu Page.Annotations() hinzu, bevor Sie Document.Save() aufrufen – eine Anmerkung, die nie zu einer Sammlung hinzugefügt wird, wird nicht in die Ausgabedatei geschrieben.
  • Verwenden Sie AnnotationCollection.Contains(annotation) bevor Sie Remove() aufrufen, wenn Sie sich nicht sicher sind, dass die Anmerkung noch vorhanden ist; Remove() gibt false zurück, anstatt eine Ausnahme zu werfen, wenn die Anmerkung fehlt.
  • Überprüfen Sie Annotation.AnnotationType(), bevor Sie beim Durchlaufen von Anmerkungen, die aus einer nicht vertrauenswürdigen oder Drittanbieter-PDF-Datei geladen wurden, einen Cast durchführen oder abhängig vom Subtyp-Verhalten verzweigen.
  • Flachen Sie Anmerkungen mit Annotation.Flatten() (oder PdfAnnotationEditor.FlatteningAnnotations() für das gesamte Dokument) ab, bevor Sie ein Dokument archivieren, damit Prüfer in anderen Werkzeugen dieselbe von Ihnen erstellte Darstellung sehen.
  • AnnotationFlags ist ein Bitfeld – kombinieren Sie Flags mit den zugrunde liegenden Ganzzahlwerten des Enums, anstatt anzunehmen, dass nur ein Flag gleichzeitig aktiv sein kann.

Häufige Probleme

ProblemUrsacheBehebung
Annotation nach dem Speichern nicht sichtbarDie Annotation wurde erstellt, aber nie zu Page.Annotations() hinzugefügtRufen Sie page.Annotations().Add(annotation) vor doc.Save() auf
Remove() gibt false zurückDie übergebene Annotationsreferenz stimmt nicht mit einem Eintrag in der Sammlung übereinVerwenden Sie zuerst Contains(), oder entfernen Sie nach Index mit Delete(index)
Falscher Annotations-Typ nach dem NeuladenDer Code ging von einem spezifischen Subtyp aus, ohne AnnotationType() zu prüfenVerzweigen Sie anhand von Annotation.AnnotationType(), bevor Sie das Objekt als spezifischen Subtyp behandeln
Link-Aktion scheint nach Zuweisung nicht gesetzt zu seinEine lokale PdfAction geriet aus dem Gültigkeitsbereich; LinkAnnotation.Action() liefert die geklonte Kopie der Annotation, nicht das OriginalobjektLesen Sie die Aktion über link.Action() zurück, anstatt die ursprüngliche lokale Variable zu behalten
Der PdfAnnotationEditor-Vorgang hat keine WirkungBindPdf() wurde nicht aufgerufen, oder wurde mit einem Pfad aufgerufen, der nicht existiertBestätigen Sie, dass BindPdf() erfolgreich ist, bevor Sie FlatteningAnnotations() oder DeleteAnnotations() aufrufen

FAQ

Wie füge ich einer PDF-Seite eine kommentarbezogene Anmerkung hinzu?

Erstellen Sie ein TextAnnotation mit dem Ziel-Document, setzen Sie dessen Rect() und Contents(), und fügen Sie es dann zu page.Annotations() hinzu, bevor Sie speichern.

Wie finde ich heraus, welche Art von Annotation ich betrachte?

Rufen Sie Annotation.AnnotationType() auf, das einen AnnotationType-Enum-Wert wie Text, Link, Highlight, FreeText, FileAttachment oder Watermark zurückgibt.

Kann eine Annotation mehr als ein Flag enthalten?

Ja. AnnotationFlags ist ein Bitfeld (Default, Invisible, Hidden, Print, NoZoom, ReadOnly, LockedContents und weitere), sodass mehrere Flags in einer einzelnen Annotation kombiniert werden können.

Was ist der Unterschied zwischen dem Flatten einer einzelnen Annotation und dem Flatten eines Dokuments?

Annotation.Flatten() fügt eine einzelne Annotation in den Inhalt ihrer Seite ein. PdfAnnotationEditor.FlatteningAnnotations() (optional auf einen Seitenbereich und AnnotationType über die Überladung, die start, end und annotType akzeptiert) flacht das gesamte gebundene Dokument in einem Aufruf ab.

Wie entferne ich alle Annotationen eines Typs aus einem Dokument?

Binden Sie das Dokument mit PdfAnnotationEditor.BindPdf(), rufen Sie DeleteAnnotations(annotType) mit dem Ziel AnnotationType auf und Save() Sie dann das Ergebnis.


API Reference Zusammenfassung

Klasse/MethodeBeschreibung
AnnotationAbstrakte Basisklasse für alle PDF-Annotationsuntertypen
Annotation.Rect() / Rect(value)Abrufen oder Festlegen des Begrenzungsrechtecks der Annotation
Annotation.Contents() / Contents(value)Lese oder setze den Textinhalt der Annotation
Annotation.AnnotationType()Gibt den AnnotationType-Enum-Wert für diese Annotation zurück
Annotation.Flags() / Flags(value)Lese oder setze das AnnotationFlags Bitfeld
Annotation.Border() / Border(value)Ruft den Border der Annotation ab oder legt ihn fest
Annotation.Color() / Color(value)Abrufen oder Festlegen der Anzeige der Annotation Color
Annotation.Flatten()Fügt diese Anmerkung in den Seiteninhalt ein und macht sie nicht interaktiv
AnnotationCollectionGeordnete Sammlung von Anmerkungen auf einer Seite, zurückgegeben von Page.Annotations()
AnnotationCollection.Add(annotation) / Add(annotation, considerRotation)Fügt der Sammlung eine Anmerkung hinzu
AnnotationCollection.Count()Gibt die Anzahl der Anmerkungen in der Sammlung zurück
AnnotationCollection.Contains(annotation)Gibt an, ob die Sammlung die angegebene Anmerkung enthält
AnnotationCollection.Remove(annotation)Entfernt eine bestimmte Anmerkung; gibt false zurück, wenn sie nicht gefunden wird
AnnotationCollection.Delete(index) / Delete(annotation)Entfernt eine Annotation nach Index oder nach Referenz
AnnotationCollection.Clear()Entfernt alle Annotationen aus der Sammlung
TextAnnotationKlebezettelartige Annotation mit Open() und Icon() (TextIcon)
LinkAnnotationAnklickbarer Bereich, der ein PdfAction via Action() / Action(value) auslöst
LinkAnnotation.Destination() / Destination(value)Lese oder setze ein explizites Navigationsziel
HighlightAnnotationMarkiert einen Textabschnitt mit einer Hervorhebungsfarbe
FreeTextAnnotationZeigt einen Text-Callout an; konfiguriert über Justification(), DefaultAppearanceObject(), Callout()
CircleAnnotationZeichnet eine Ellipse innerhalb des Rechtecks der Annotation
WatermarkAnnotationOverlay-Annotation mit einem Opacity() / Opacity(value) Accessor
WidgetAnnotationFormfeld-Erscheinungsannotation mit ReadOnly(), Required(), Exportable(), DefaultAppearance()
NamedActionVordefinierte Navigationsaktion (PredefinedAction Enum) an ein LinkAnnotation anhängbar
JavascriptActionFührt einen ECMAScript-String über Script() / GetECMAScriptString() aus
SubmitFormActionSendet Formulardaten an eine FileSpecification URL über Url() / Url(value)
BorderAnmerkungsrahmen mit Width(), Style() (BorderStyle), Effect() (BorderEffect)
PdfAnnotationEditorFassade für den dokumentweiten Import, die Modifikation, das Flattening und das Löschen von Annotationen
PdfAnnotationEditor.FlatteningAnnotations()Flacht Annotationen im gebundenen Dokument ab
PdfAnnotationEditor.DeleteAnnotations(annotType)Löscht alle Annotationen eines gegebenen AnnotationType
PdfAnnotationEditor.ImportAnnotationsFromXfdf(xfdfFile)Importiert Annotationen aus einer XFDF-Datei

Siehe auch

 Deutsch