Hur man arbetar med annoteringar i TypeScript

Hur man arbetar med annoteringar i TypeScript

Den här guiden visar hur man lägger till, plattar till och söker PDF-annotationer med Aspose.PDF FOSS för TypeScript. Klassen Page exponerar en Add* metod per annoteringstyp — markup (highlight, underline, strikeout, squiggly), shapes (square, circle, line, polygon, ink), text (sticky note, free text) och links — var och en returnerar ett typat Annotation handtag som kan läsas tillbaka eller plattas till senare. Den kräver Node.js 22 eller senare.

Steg-för-steg-guide

Steg 1: Installera paketet

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

Verifiera installationen genom att importera Document-klassen i en ny TypeScript-fil — den här raden bör lösa utan fel när paketet är installerat:

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

Steg 2: Importera nödvändiga klasser

Importera Document för att öppna filen och Page för annoteringstypens signaturer som används i stegen nedan:

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

Steg 3: Lägg till markup-annotationer

Page.AddHighlight(), Page.AddUnderline(), Page.AddSquiggly() och Page.AddStrikeOut() tar alla en quads-array — en 8-siffrig kvadrupel (x1,y1,x2,y2,x3,y3,x4,y4) per markerat textområde — samt en color och valfri contents. Biblioteket genererar automatiskt appearanceströmmen (/AP) för alla fyra undertyper:

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

Steg 4: Lägg till form- och bläckannotationer

Page.AddSquare() och Page.AddCircle() tar en begränsande rect plus color (stroke) och valfri fill. Page.AddLine() tar en 4-siffrig line (x1,y1,x2,y2) och valfria piländar. Page.AddInk() tar paths — en array av platta punktpar-arrayer, en per pennstreck:

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

Steg 5: Lägg till en sticky note och fri text

Page.AddTextNote() placerar en klickbar ikon som öppnar ett kommentars-popup. Page.AddFreeText() ritar text direkt på sidan inom sin 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,
});

Steg 6: Platta ut en annotation till statiskt innehåll

Varje annoteringshandtag som returneras av ett Add*-anrop har en Flatten()-metod som inbakar annoteringens utseende i sidans innehållsström och tar bort den från /Annots. Efter plattläggning finns det inget kvar att klicka på eller redigera i en visare:

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

Steg 7: Sök annoteringstext

Page.SearchAnnotationText() and Page.SearchAnnotations() är disjunkta i båda riktningarna: SearchAnnotationText() matchar bokstavlig annoteringsmetadata (/Contents, /T, /Subj), medan SearchAnnotations() matchar rendered texten för markup-annotationer såsom 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);

Vanliga problem och lösningar

Page.AddHighlight() (eller en annan markup-metod) ritas på fel ställe. quads är en 8-siffrig platt array (x1,y1,x2,y2,x3,y3,x4,y4), inte en rect — att skicka en 4-siffrig rektangel ger en degenererad eller saknad fyrkant. Skapa en fyrkant per rad med markerad text.

En plattad annotation är fortfarande klickbar. Flatten() måste anropas på objektet som returneras av Add* anropet, och dokumentet måste sparas (doc.WriteTo() / doc.Save()) efter plattning — ändringen finns bara i minnet tills filen skrivs tillbaka.

SearchAnnotationText() returnerar inga träffar även om texten är synlig på sidan. Den söker endast i annoteringsmetadatafält (/Contents, /T, /Subj) — synlig markup-text renderad från en annoterings egen utseende (t.ex. en FreeText kropp) hittas av SearchAnnotations() istället, och den söker inte heller igenom vanligt sidinnehåll (använd Page.GetText() or Page.Search() för det).

Röjningsmarkeringar visas inte när man söker i annotationer. Page.AddRedact() skapar en RedactAnnotation, en distinkt undertyp från markup/shape/text-annotationerna som täcks här — se den Redaction guide.

Vanliga frågor

Hur många annoteringssubtyper stöder Page?

Biblioteket genererar utseenden för markup (highlight, underline, strikeout, squiggly), former (square, circle, line, polygon, ink), text (sticky note, free text), länkar och stämplar — samt filbilagor och redigeringsannotationer, som behandlas i sina egna hur-gör-du-det-guider.

Kan jag läsa annotationer som redan finns på en sida?

Ja — Page.Annotations returnerar de befintliga annotationerna som en array av typade handtag som du kan inspektera, redigera eller platta till, och Page.RemoveAnnotation(a) tar bort en.

Vad är skillnaden mellan att platta till en annotation och att applicera en redigering?

Flatten() bakar en annoterings appearance i sidan och tar bort annoteringsobjektet, men all text eller bildinnehåll under det förblir orört. ApplyRedactions() skrivs destruktivt om innehållsströmmen så att det täckta innehållet själv försvinner — se Redaction guide för detaljer.

Behålls annotationer genom en spara/öppna-cykel?

Ja — annotationer som lagts till före doc.WriteTo() / doc.Save() skrivs in i PDF:en och läses tillbaka korrekt vid nästa Document.Open() / Document.OpenFile().

Se även

 Svenska