Comment travailler avec les annotations en TypeScript
Ce guide montre comment ajouter, aplatir et rechercher des annotations PDF avec Aspose.PDF FOSS pour TypeScript. La classe Page expose une méthode Add* par sous-type d’annotation — balisage (surlignage, soulignement, barré, ondulé), formes (carré, cercle, ligne, polygone, encre), texte (note autocollante, texte libre) et liens — chacune renvoyant un handle typé Annotation qui peut être relu ou aplati ultérieurement. Elle nécessite Node.js22 ou une version ultérieure.
Guide pas à pas
Étape 1: Installer le paquet
git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-TypeScript.git
cd Aspose.PDF-FOSS-for-TypeScript
npm install
npm run buildVérifiez l’installation en important la classe Document dans un nouveau fichier TypeScript — cette ligne doit se résoudre sans erreur une fois le paquet installé:
import { Document } from '@asposefoss/pdf';Étape 2: Importer les classes requises
Importez Document pour ouvrir le fichier et Page pour les signatures des types d’annotation utilisées dans les étapes ci-dessous:
import { Document, Page } from '@asposefoss/pdf';Étape3: Ajouter des annotations de mise en forme
Page.AddHighlight(), Page.AddUnderline(), Page.AddSquiggly() et Page.AddStrikeOut() acceptent tous un tableau quads — un quad de 8 nombres (x1,y1,x2,y2,x3,y3,x4,y4) par région de texte mise en évidence — plus un color et éventuellement un contents. La bibliothèque génère automatiquement le flux d’apparence (/AP) pour les quatre sous-types:
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');Étape4: Ajouter des annotations de forme et d’encre
Page.AddSquare() et Page.AddCircle() prennent un rect de délimitation plus color (trait) et éventuellement fill. Page.AddLine() accepte un line de 4 nombres (x1,y1,x2,y2) et des extrémités de flèche optionnelles. Page.AddInk() prend paths — un tableau de paires de points plates, une par tracé de stylo:
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,
});Étape5: Ajouter une note autocollante et du texte libre
Page.AddTextNote() place une icône cliquable qui ouvre une fenêtre contextuelle de commentaire. Page.AddFreeText() dessine du texte directement sur la page à l’intérieur de son 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,
});Étape6: Aplatir une annotation en contenu statique
Chaque poignée d’annotation retournée par un appel Add* possède une méthode Flatten() qui intègre l’apparence de l’annotation dans le flux de contenu de la page et l’enlève de /Annots. Après aplatissage, il ne reste rien à cliquer ou à modifier dans un visualiseur :
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
Étape7: Rechercher le texte de l’annotation
Page.SearchAnnotationText() and Page.SearchAnnotations() sont disjoints dans les deux sens : SearchAnnotationText() correspond à des métadonnées d’annotation littérales (/Contents, /T, /Subj), tandis que SearchAnnotations() correspond au rendered texte des balises d’annotation telles que 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);Problèmes courants et solutions
Page.AddHighlight() (ou une autre méthode de balisage) s’affiche au mauvais endroit. quads est un tableau plat de 8 nombres (x1,y1,x2,y2,x3,y3,x4,y4), pas un rect — passer un rectangle à 4 nombres produit un quad dégénéré ou manquant. Créez un quad par ligne de texte surligné.
Une annotation aplatie reste cliquable. Flatten() doit être appelé sur l’objet renvoyé par le Add* appel, et le document doit être enregistré (doc.WriteTo() / doc.Save()) après l’aplatissement — la modification n’existe en mémoire que jusqu’à ce que le fichier soit réécrit.
SearchAnnotationText() ne renvoie aucun résultat même si le texte est visible sur la page. Il ne recherche que les champs de métadonnées des annotations (/Contents, /T, /Subj) — texte de balisage visible rendu à partir de l’apparence propre d’une annotation (par ex. un FreeText corps) est trouvé par SearchAnnotations() à la place, et ne recherche pas non plus le contenu ordinaire des pages (utilisez Page.GetText() or Page.Search() pour cela).
Les marques de rédaction n’apparaissent pas lors de la recherche d’annotations. Page.AddRedact() crée un RedactAnnotation, un sous-type distinct des annotations de balisage/forme/texte couvertes ici — voir le Redaction guide.
Foire aux questions
Combien de sous-types d’annotation Page prend-il en charge?
La bibliothèque génère les apparences pour le balisage (mise en évidence, soulignement, barré, ondulation), les formes (carré, cercle, ligne, polygone, encre), le texte (note autocollante, texte libre), les liens et les tampons — ainsi que les pièces jointes et les annotations de rédaction, qui font l’objet de leurs propres guides pratiques.
Puis-je lire les annotations déjà présentes sur une page?
Oui — Page.Annotations renvoie les annotations existantes sous forme de tableau de poignées typées que vous pouvez inspecter, modifier ou aplatir, et Page.RemoveAnnotation(a) en supprime une.
Quelle est la différence entre aplatir une annotation et appliquer une rédaction?
Flatten() cuit une annotation’s appearance dans la page et supprime l’objet d’annotation, mais tout le texte ou le contenu image en dessous reste intact. ApplyRedactions() réécrit de manière destructive le flux de contenu de sorte que le contenu couvert disparaisse — see the Redaction guide for details.
Les annotations sont-elles conservées lors d’un aller-retour enregistrement/ouverture?
Oui — les annotations ajoutées avant doc.WriteTo() / doc.Save() sont écrites dans le PDF et relues correctement lors du prochain Document.Open() / Document.OpenFile().