Jak pracovat s anotacemi v TypeScript
Tento průvodce ukazuje, jak přidávat, zploštit a vyhledávat PDF anotace pomocí Aspose.PDF FOSS pro TypeScript. Třída Page poskytuje jednu Add* metodu pro každý podtyp anotace — markup (zvýraznění, podtržení, přeškrtnutí, vlnovka), tvary (čtverec, kruh, čára, polygon, inkoust), text (poznámka, volný text) a odkazy — každá vrací typovaný Annotation handle, který lze později načíst nebo zploštit. Vyžaduje Node.js 22 nebo novější.
Průvodce krok za krokem
Krok 1: Nainstalujte balíček
git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-TypeScript.git
cd Aspose.PDF-FOSS-for-TypeScript
npm install
npm run buildOvěřte instalaci importováním třídy Document v novém souboru TypeScript — tento řádek by měl být bez chyb, jakmile je balíček nainstalován:
import { Document } from '@asposefoss/pdf';Krok 2: Importujte požadované třídy
Importujte Document pro otevření souboru a Page pro podpisy typů anotací použité v níže uvedených krocích:
import { Document, Page } from '@asposefoss/pdf';Krok 3: Přidat značkové anotace
Page.AddHighlight(), Page.AddUnderline(), Page.AddSquiggly() a Page.AddStrikeOut() všechny přijímají pole quads— jeden osmčíselný čtyřúhelník (x1,y1,x2,y2,x3,y3,x4,y4) na každou zvýrazněnou oblast textu— plus color a volitelný contents. Knihovna automaticky generuje proud vzhledu (/AP) pro všechny čtyři podtypy:
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');Krok 4: Přidat tvarové a inkové anotace
Page.AddSquare() a Page.AddCircle() přijímají ohraničující rect plus color (čára) a volitelný fill. Page.AddLine() přijímá 4-číselný line (x1,y1,x2,y2) a volitelné konce šipek. Page.AddInk() přijímá paths— pole plochých dvojic bodů, jedno pro každý tah pera:
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,
});Krok 5: Přidat lepkavou poznámku a volný text
Page.AddTextNote() umisťuje klikací ikonu, která otevře vyskakovací okno komentáře. Page.AddFreeText() kreslí text přímo na stránce uvnitř svého 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,
});Krok 6: Zploštit anotaci na statický obsah
Každá rukojeť anotace vrácená voláním Add* má metodu Flatten(), která zapracuje vzhled anotace do proudu obsahu stránky a odstraní jej z /Annots. Po zploštění už v prohlížeči nezůstane nic, co by šlo kliknout nebo upravit:
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
Krok 7: Vyhledat text anotace
Page.SearchAnnotationText() and Page.SearchAnnotations() jsou disjunktní v obou směrech: SearchAnnotationText() odpovídá doslovným metadatům anotace (/Contents, /T, /Subj), zatímco SearchAnnotations() odpovídá rendered textu značkovacích anotací, jako jsou 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);Běžné problémy a opravy
Page.AddHighlight() (nebo jiná metoda značkování) se vykresluje na špatném místě. quads je ploché pole o 8 číslech (x1,y1,x2,y2,x3,y3,x4,y4), ne rect — předání 4-čísleného obdélníku vytváří degenerovaný nebo chybějící čtyřúhelník. Vytvořte jeden čtyřúhelník na řádek zvýrazněného textu.
Zploštěná anotace je stále kliknutelná. Flatten() musí být zavolána na objektu vráceném metodou Add* volání, a dokument musí být uložen (doc.WriteTo() / doc.Save()) po zploštění — změna existuje pouze v paměti, dokud není soubor znovu zapsán.
SearchAnnotationText() nevrací žádné výsledky, i když je text na stránce viditelný. Vyhledává pouze pole metadat anotace (/Contents, /T, /Subj) — viditelný text značek vykreslený z vlastního vzhledu anotace (např. a FreeText tělo) je nalezeno pomocí SearchAnnotations() místo toho a nevyhledává běžný obsah stránky (použijte Page.GetText() or Page.Search() k tomu).
Značky redakce se nezobrazují při vyhledávání anotací. Page.AddRedact() vytvoří RedactAnnotation, odlišný podtyp od markup/shape/text anotací pokrytých zde — viz Redaction průvodce.
Často kladené otázky
Kolik podtypů anotací Page podporuje?
Knihovna generuje vzhledy pro markup (highlight, underline, strikeout, squiggly), tvary (square, circle, line, polygon, ink), text (sticky note, free text), odkazy a razítka — plus file attachment a redaction anotace, které jsou pokryty ve svých vlastních how-to průvodcích.
Mohu číst anotace, které již na stránce existují?
Ano — Page.Annotations vrací existující anotace jako pole typovaných handle, které můžete prohlížet, upravovat nebo zploštit, a Page.RemoveAnnotation(a) odebere jednu.
Jaký je rozdíl mezi zploštěním anotace a aplikací redakce?
Flatten() vkládá anotaci appearance do stránky a odstraní objekt anotace, ale jakýkoli text nebo obrázek pod ním zůstane nedotčen. ApplyRedactions() destruktivně přepíše obsahový stream, takže pokrytý obsah samotný zmizí — viz Redaction průvodce pro podrobnosti.
Zůstávají anotace zachovány během cyklu uložení/otevření?
Ano — anotace přidané před doc.WriteTo() / doc.Save() jsou zapsány do PDF a při dalším Document.Open() / Document.OpenFile() jsou správně načteny zpět.