Jak pracować z adnotacjami w TypeScript
Ten przewodnik pokazuje, jak dodawać, spłaszczać i wyszukiwać adnotacje PDF przy użyciu Aspose.PDF FOSS dla TypeScript. Klasa Page udostępnia jedną metodę Add* dla każdego podtypu adnotacji — oznaczenia (podświetlenie, podkreślenie, przekreślenie, faliste), kształty (kwadrat, koło, linia, wielokąt, tusz), tekst (notatka samoprzylepna, wolny tekst) i linki — każda zwraca typizowany uchwyt Annotation, który może być odczytany ponownie lub spłaszczony później. Wymaga Node.js 22 lub nowszego.
Przewodnik krok po kroku
Krok 1: Zainstaluj pakiet
git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-TypeScript.git
cd Aspose.PDF-FOSS-for-TypeScript
npm install
npm run buildZweryfikuj instalację, importując klasę Document w nowym pliku TypeScript — ta linia powinna się rozwiązać bez błędu po zainstalowaniu pakietu:
import { Document } from '@asposefoss/pdf';Krok 2: Zaimportuj wymagane klasy
Zaimportuj Document, aby otworzyć plik, oraz Page dla sygnatur typów adnotacji używanych w poniższych krokach:
import { Document, Page } from '@asposefoss/pdf';Krok 3: Dodaj adnotacje znaczników
Page.AddHighlight(), Page.AddUnderline(), Page.AddSquiggly() i Page.AddStrikeOut() przyjmują wszystkie tablicę quads — po jedną ósemkową czwórkę (x1,y1,x2,y2,x3,y3,x4,y4) na każdy podświetlony fragment tekstu — oraz color i opcjonalny contents. Biblioteka generuje strumień wyglądu (/AP) dla wszystkich czterech podtypów automatycznie:
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: Dodaj adnotacje kształtów i atramentu
Page.AddSquare() i Page.AddCircle() przyjmują ograniczający rect plus color (obrys) oraz opcjonalny fill. Page.AddLine() przyjmuje 4-liczbowy line (x1,y1,x2,y2) i opcjonalne zakończenia strzałek. Page.AddInk() przyjmuje paths — tablicę płaskich tablic par punktów, po jednej na każde pociągnięcie pióra:
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: Dodaj notatkę samoprzylepną i wolny tekst
Page.AddTextNote() umieszcza klikalną ikonę, która otwiera wyskakujące okienko komentarza. Page.AddFreeText() rysuje tekst bezpośrednio na stronie wewnątrz jego 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: Spłaszcz adnotację do treści statycznej
Każdy uchwyt adnotacji zwrócony przez wywołanie Add* posiada metodę Flatten(), która włącza wygląd adnotacji do strumienia zawartości strony i usuwa go z /Annots. Po spłaszczeniu nie pozostaje nic do kliknięcia ani edycji w przeglądarce:
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: Wyszukiwanie tekstu adnotacji
Page.SearchAnnotationText() and Page.SearchAnnotations() są rozłączne w obu kierunkach: SearchAnnotationText() dopasowuje dosłowną metadane adnotacji (/Contents, /T, /Subj), podczas gdy SearchAnnotations() dopasowuje do rendered tekst adnotacji znaczników, takich jak 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);Typowe problemy i rozwiązania
Page.AddHighlight() (lub inna metoda znaczników) rysuje w niewłaściwym miejscu. quads jest jednowymiarową tablicą 8 liczb (x1,y1,x2,y2,x3,y3,x4,y4), nie jest rect — przekazanie prostokąta składającego się z 4 liczb powoduje zdegenerowany lub brakujący czworokąt. Utwórz jeden czworokąt na każdy wiersz zaznaczonego tekstu.
Spłaszczona adnotacja nadal jest klikalna. Flatten() musi być wywołane na obiekcie zwróconym przez Add* wywołanie, a dokument musi być zapisany (doc.WriteTo() / doc.Save()) po spłaszczeniu — zmiana istnieje tylko w pamięci, dopóki plik nie zostanie zapisany ponownie.
SearchAnnotationText() zwraca brak wyników, mimo że tekst jest widoczny na stronie. Przeszukuje tylko pola metadanych adnotacji (/Contents, /T, /Subj) — widoczny tekst znaczników renderowany z własnego wyglądu adnotacji (np. a FreeText ciało) jest znajdowane przez SearchAnnotations() zamiast tego, i nie przeszukuje zwykłej zawartości strony (użyj Page.GetText() or Page.Search() do tego).
Znaczniki redakcyjne nie pojawiają się podczas przeszukiwania anotacji. Page.AddRedact() tworzy RedactAnnotation, odrębny podtyp od adnotacji markup/shape/text omówionych tutaj — zobacz Redaction przewodnik.
Najczęściej zadawane pytania
Ile podtypów adnotacji obsługuje Page?
Biblioteka generuje wyglądy dla znakowania (podświetlenie, podkreślenie, przekreślenie, falista linia), kształtów (kwadrat, koło, linia, wielokąt, atrament), tekstu (notatka samoprzylepna, wolny tekst), linków i pieczęci — oraz adnotacji załączników plików i redakcji, które są opisane w oddzielnych przewodnikach „jak to zrobić”.
Czy mogę odczytać adnotacje, które już istnieją na stronie?
Tak — Page.Annotations zwraca istniejące adnotacje jako tablicę typowanych uchwytów, które możesz przeglądać, edytować lub spłaszczyć, a Page.RemoveAnnotation(a) usuwa jedną.
Jaka jest różnica między spłaszczeniem adnotacji a zastosowaniem redakcji?
Flatten() przygotowuje adnotację’s appearance do strony i usuwa obiekt adnotacji, ale wszelki tekst lub obraz znajdujący się pod nim pozostaje nietknięty. ApplyRedactions() destrukcyjnie przepisuje strumień zawartości, więc sam ukryty content znika — zobacz przewodnik Redaction, aby uzyskać szczegóły.
Czy adnotacje są zachowywane podczas cyklu zapisu/otwarcia?
Tak — adnotacje dodane przed doc.WriteTo() / doc.Save() są zapisywane w pliku PDF i prawidłowo odczytywane przy następnym Document.Open() / Document.OpenFile().