Wie man mit Annotationen in TypeScript arbeitet

Wie man mit Annotationen in TypeScript arbeitet

Dieses Handbuch zeigt, wie man PDF-Anmerkungen mit Aspose.PDF FOSS für TypeScript hinzufügt, flacht und durchsucht. Die Page-Klasse stellt für jeden Anmerkungsuntertyp eine Add*-Methode bereit — Markup (Hervorhebung, Unterstreichung, Durchstreichung, Zickzack), Formen (Quadrat, Kreis, Linie, Polygon, Tinte), Text (Notizzettel, Freitext) und Links — die jeweils ein typisiertes Annotation-Handle zurückgeben, das später wieder ausgelesen oder flachgelegt werden kann. Sie erfordert Node.js 22 oder höher.

Schritt-für-Schritt-Anleitung

Schritt 1: Paket installieren

git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-TypeScript.git
cd Aspose.PDF-FOSS-for-TypeScript
npm install
npm run build

Überprüfen Sie die Installation, indem Sie die Document-Klasse in einer neuen TypeScript-Datei importieren — diese Zeile sollte ohne Fehler aufgelöst werden, sobald das Paket installiert ist:

import { Document } from '@asposefoss/pdf';

Schritt 2: Erforderliche Klassen importieren

Importieren Sie Document, um die Datei zu öffnen, und Page für die Signaturen der Anmerkungstypen, die in den nachstehenden Schritten verwendet werden:

import { Document, Page } from '@asposefoss/pdf';

Schritt 3: Markup-Anmerkungen hinzufügen

Page.AddHighlight(), Page.AddUnderline(), Page.AddSquiggly() und Page.AddStrikeOut() akzeptieren alle ein quads-Array — ein 8-Zahlen-Quad (x1,y1,x2,y2,x3,y3,x4,y4) pro hervorgehobenen Textbereich — sowie ein color und optional contents. Die Bibliothek erzeugt den Erscheinungs-Stream (/AP) für alle vier Subtypen automatisch:

import { Document } from '@asposefoss/pdf';

const doc = Document.OpenFile('input.pdf');
const page = doc.Pages[0];

page.AddHighlight({
  quads: [72, 700, 300, 700, 72, 685, 300, 685],
  color: [1, 1, 0],
  contents: 'Yellow highlight',
});
page.AddUnderline({
  quads: [72, 660, 300, 660, 72, 645, 300, 645],
  color: [0, 0, 1],
});
page.AddStrikeOut({
  quads: [72, 620, 300, 620, 72, 605, 300, 605],
  color: [1, 0, 0],
});

doc.WriteTo('annotated.pdf');

Schritt 4: Form- und Tinten-Anmerkungen hinzufügen

Page.AddSquare() und Page.AddCircle() benötigen ein begrenzendes rect plus color (Strich) und optional fill. Page.AddLine() verwendet ein 4-Zahlen-line (x1,y1,x2,y2) und optionale Pfeilenden. Page.AddInk() akzeptiert paths — ein Array flacher Punkt-Paar-Arrays, eines pro Stiftstrich:

page.AddSquare({ rect: [100, 500, 220, 560], color: [0.8, 0, 0], fill: [1, 1, 0.5], width: 2 });
page.AddCircle({ rect: [250, 500, 370, 560], color: [0, 0.5, 0], width: 2 });
page.AddLine({
  line: [100, 470, 370, 470],
  color: [0, 0, 0.7],
  width: 2,
  startEnding: 'OpenArrow',
  endEnding: 'ClosedArrow',
});
page.AddInk({
  paths: [[100, 400, 130, 430, 160, 390, 190, 420]],
  color: [0.6, 0, 0.6],
  width: 2,
});

Schritt 5: Eine Haftnotiz und freien Text hinzufügen

Page.AddTextNote() platziert ein anklickbares Symbol, das ein Kommentar-Popup öffnet. Page.AddFreeText() zeichnet Text direkt auf die Seite innerhalb seines rect:

page.AddTextNote({
  rect: [400, 700, 420, 720],
  icon: 'Note',
  author: 'Reviewer',
  contents: 'This is a sticky-note annotation.',
});

page.AddFreeText({
  rect: [400, 600, 550, 660],
  contents: 'FreeText sample',
  fontSize: 10,
  align: 'center',
  fill: [1, 1, 0.8],
  width: 1,
});

Schritt 6: Eine Anmerkung in statischen Inhalt umwandeln

Jeder von einem Add*-Aufruf zurückgegebene Annotations-Handle verfügt über eine Flatten()-Methode, die das Aussehen der Annotation in den Inhaltsstrom der Seite einbettet und es aus /Annots entfernt. Nach dem Flattening ist in einem Viewer nichts mehr anklickbar oder editierbar:

const note = page.AddFreeText({
  rect: [210, 535, 470, 590],
  contents: 'Sticky note — flattened into the page.',
  fontSize: 11,
  align: 'left',
});

note.Flatten(); // -> boolean; bakes the annotation, unwires itself from /Annots

Schritt 7: Annotations-Text suchen

Page.SearchAnnotationText() and Page.SearchAnnotations() sind in beiden Richtungen disjunkt: SearchAnnotationText() entspricht wörtlichen Annotations-Metadaten (/Contents, /T, /Subj), während SearchAnnotations() passt zu dem rendered Text von Markup-Annotationen wie FreeText:

const metadataHits = page.SearchAnnotationText('confidential');
for (const hit of metadataHits) {
  console.log(hit.key, hit.value); // e.g. 'Contents', 'confidential'
}

const renderedHits = page.SearchAnnotations('confidential');
console.log(renderedHits.length);

Häufige Probleme und Lösungen

Page.AddHighlight() (oder eine andere Markup-Methode) wird an der falschen Stelle gezeichnet. quads ist ein flaches Array mit 8 Zahlen (x1,y1,x2,y2,x3,y3,x4,y4), nicht ein rect — Das Übergeben eines 4-Zahlen-Rechtecks erzeugt ein entartetes oder fehlendes Viereck. Erstelle ein Viereck pro Zeile des hervorgehobenen Textes.

Eine abgeflachte Annotation ist weiterhin anklickbar. Flatten() muss auf dem Objekt aufgerufen werden, das von der Add* Aufruf, und das Dokument muss gespeichert werden (doc.WriteTo() / doc.Save()) nach dem Abflachen — die Änderung existiert nur im Speicher, bis die Datei wieder geschrieben wird.

SearchAnnotationText() liefert keine Treffer, obwohl der Text auf der Seite sichtbar ist. Es durchsucht nur Metadatenfelder von Annotationen (/Contents, /T, /Subj) — sichtbarer Markup-Text, der aus dem eigenen Aussehen einer Annotation gerendert wird (z.B. ein FreeText body) wird gefunden durch SearchAnnotations() stattdessen, und weder normalen Seiteninhalt durchsucht (verwende Page.GetText() or Page.Search() für das).

Redaction-Markierungen werden bei der Suche nach Anmerkungen nicht angezeigt. Page.AddRedact() erstellt ein RedactAnnotation, ein eindeutiger Subtyp von den hier behandelten Markup/Shape/Text-Anmerkungen — siehe die Redaction Anleitung.

Häufig gestellte Fragen

Wie viele Anmerkungs-Subtypen unterstützt Page?

Die Bibliothek erzeugt Erscheinungsbilder für Markup (Hervorhebung, Unterstreichung, Durchstreichung, wellige Linie), Formen (Quadrat, Kreis, Linie, Polygon, Tinte), Text (Notizzettel, Freitext), Links und Stempel — plus Dateianhangs- und Redaktions-Anmerkungen, die in eigenen Anleitungen behandelt werden.

Kann ich Anmerkungen lesen, die bereits auf einer Seite existieren?

Ja — Page.Annotations gibt die bestehenden Anmerkungen als ein Array von typisierten Handles zurück, die Sie prüfen, bearbeiten oder flachlegen können, und Page.RemoveAnnotation(a) entfernt eine.

Was ist der Unterschied zwischen dem Flachlegen einer Anmerkung und dem Anwenden einer Redaktion?

Flatten() bäckt die Anmerkung appearance in die Seite ein und entfernt das Anmerkungsobjekt, aber jeglicher Text oder Bildinhalt darunter bleibt unverändert. ApplyRedactions() überschreibt den Inhaltsstrom destruktiv, sodass der betroffene Inhalt selbst entfernt wird — siehe den Redaction-Leitfaden für Details.

Werden Anmerkungen bei einem Speicher/Öffnen-Durchlauf beibehalten?

Ja — Anmerkungen, die vor doc.WriteTo() / doc.Save() hinzugefügt wurden, werden in das PDF geschrieben und beim nächsten Document.Open() / Document.OpenFile() korrekt wieder ausgelesen.

Siehe auch

 Deutsch