Hoe werk je met annotaties in TypeScript

Hoe werk je met annotaties in TypeScript

Deze gids laat zien hoe je PDF-annotaties kunt toevoegen, flatten en zoeken met Aspose.PDF FOSS voor TypeScript. De Page klasse exposeert één Add* methode per annotatiesubtype — markup (highlight, underline, strikeout, squiggly), shapes (square, circle, line, polygon, ink), text (sticky note, free text) en links — die elk een getypeerde Annotation handle teruggeeft die later kan worden uitgelezen of flattened. Het vereist Node.js 22 of later.

Stap-voor-stap gids

Stap 1: Installeer het pakket

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

Verifieer de installatie door de Document klasse te importeren in een nieuw TypeScript bestand — deze regel zou zonder fout moeten werken zodra het pakket geïnstalleerd is:

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

Stap 2: Importeer vereiste klassen

Importeer Document om het bestand te openen en Page voor de annotatietypehandtekeningen die in de onderstaande stappen worden gebruikt:

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

Stap 3: Markup-annotaties toevoegen

Page.AddHighlight(), Page.AddUnderline(), Page.AddSquiggly() en Page.AddStrikeOut() nemen allemaal een quads array — één 8-cijferig quad (x1,y1,x2,y2,x3,y3,x4,y4) per gemarkeerd tekstgebied — plus een color en optioneel contents. De bibliotheek genereert de weergavestroom (/AP) voor alle vier subtypes 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');

Stap 4: Vorm- en inkt-annotaties toevoegen

Page.AddSquare() en Page.AddCircle() nemen een begrenzende rect plus color (stroke) en optioneel fill. Page.AddLine() neemt een 4-cijferige line (x1,y1,x2,y2) en optionele pijleinden. Page.AddInk() neemt paths — een array van platte punt-paar-arrays, één per penstreek:

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

Stap 5: Een Sticky Note en vrije tekst toevoegen

Page.AddTextNote() plaatst een klikbaar pictogram dat een commentaar-popup opent. Page.AddFreeText() tekent tekst rechtstreeks op de pagina binnen zijn 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,
});

Stap 6: Een annotatie flatten tot statische inhoud

Elke annotatie-handvat dat wordt geretourneerd door een Add*-aanroep heeft een Flatten()-methode die de weergave van de annotatie in de content-stream van de pagina verwerkt en het verwijdert uit /Annots. Na het flattenen is er niets meer om op te klikken of te bewerken in een viewer:

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

Stap 7: Zoek annotatietekst

Page.SearchAnnotationText() and Page.SearchAnnotations() zijn in beide richtingen disjunct: SearchAnnotationText() komt overeen met letterlijke annotatiemetadata (/Contents, /T, /Subj), terwijl SearchAnnotations() komt overeen met de rendered tekst van opmaakannotaties zoals 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);

Veelvoorkomende problemen en oplossingen

Page.AddHighlight() (of een andere opmaakmethode) wordt op de verkeerde plaats getekend. quads is een platte array van 8 getallen (x1,y1,x2,y2,x3,y3,x4,y4), niet een rect — het doorgeven van een rechthoek met 4 getallen levert een degeneraat of ontbrekend quad op. Maak één quad per regel van gemarkeerde tekst.

Een geflatte annotatie is nog steeds klikbaar. Flatten() moet worden aangeroepen op het object dat wordt geretourneerd door de Add* aanroep, en het document moet worden opgeslagen (doc.WriteTo() / doc.Save()) na het flattenen — de wijziging bestaat alleen in het geheugen totdat het bestand weer wordt weggeschreven.

SearchAnnotationText() geeft geen resultaten terug, hoewel de tekst zichtbaar is op de pagina. Het doorzoekt alleen annotatie-metadata-velden (/Contents, /T, /Subj) — zichtbare opmaaktekst die wordt gerenderd vanuit de eigen weergave van een annotatie (bijv. een FreeText body) wordt gevonden door SearchAnnotations() in plaats daarvan, en zoekt geen gewone paginainhoud (gebruik Page.GetText() or Page.Search() daartoe).

Redactie-markeringen verschijnen niet bij het zoeken naar annotaties. Page.AddRedact() maakt een RedactAnnotation, een distinct subtype van de markup/shape/text-annotaties die hier worden behandeld — zie de Redaction gids.

Veelgestelde vragen

Hoeveel annotatie-subtypes ondersteunt Page?

De bibliotheek genereert weergaven voor markup (markering, onderstrepen, doorhalen, golvend), vormen (vierkant, cirkel, lijn, veelhoek, inkt), tekst (plaknotitie, vrije tekst), links en stempels — plus bestandsbijlage- en redactiemarkeringen, die elk in hun eigen handleiding worden behandeld.

Kan ik annotaties lezen die al op een pagina bestaan?

Ja — Page.Annotations retourneert de bestaande annotaties als een array van getypeerde handles die je kunt inspecteren, bewerken of flatten, en Page.RemoveAnnotation(a) verwijdert er één.

Wat is het verschil tussen het flattenen van een annotatie en het toepassen van een redactiemarkering?

Flatten() bakt een annotatie’s appearance in de pagina en verwijdert het annotatie-object, maar alle tekst- of afbeeldingsinhoud eronder blijft ongewijzigd. ApplyRedactions() schrijft de content-stroom destructief opnieuw, waardoor de bedekte inhoud zelf weg is — zie de Redaction-gids voor details.

Worden annotaties bewaard tijdens een opslaan/open-cyclus?

Ja — annotaties die vóór doc.WriteTo() / doc.Save() zijn toegevoegd, worden in de PDF geschreven en bij de volgende Document.Open() / Document.OpenFile() correct teruggelezen.

Zie ook

 Nederlands