Comment travailler avec la structure PDF en TypeScript
Ce guide montre comment créer une navigation de document et une structure logique dans les fichiers PDF avec Aspose.PDF FOSS pour TypeScript: une table des matières cliquable sur une page, un plan de signets au niveau du document, des destinations nommées et un arbre de structure balisé pour l’accessibilité. Il nécessite Node.js 22 ou une version ultérieure.
Guide étape par étape
Étape 1: installer le package
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 devrait se résoudre sans erreur une fois le package installé:
import { Document } from '@asposefoss/pdf';Étape 2: importer les classes requises
Importez Document pour ouvrir le fichier et OutlineItem pour les entrées de signet créées à l’étape 4:
import { Document, OutlineItem } from '@asposefoss/pdf';Étape 3: Ajouter une table des matières
Page.AddTOC() prend un tableau d’entrées { title, page }, un rect de délimitation, et des options de style; il trace des tirets pointillés et des liens cliquables vers les pages cibles:
const page = doc.Pages[0];
page.AddTOC(
[
{ title: '1. Introduction', page: 2 },
{ title: '2. Methodology', page: 5 },
{ title: '3. Results', page: 9 },
],
[72, 160, 400, 600],
{ font: 'Helvetica', fontSize: 13, color: [0.1, 0.1, 0.15], rowGap: 18 },
);Étape 4: Ajouter des signets
Document.SetOutlines() remplace le panneau de signets du document par un tableau d’objets OutlineItem. Chaque élément peut contenir un Dest (destination de page), du style (Color, Bold), et un Children imbriqué pour un arbre pliable:
const items: OutlineItem[] = [
{ Title: 'Sales', Dest: { name: 'section.sales' }, Open: true, Color: [0.1, 0.4, 0.1] },
{ Title: 'Appendix', Dest: { name: 'section.appendix' } },
];
doc.SetOutlines(items);Étape 5: Lire les repères et les destinations nommées
Document.GetOutlines() renvoie l’arbre de signets actuel. Document.GetNamedDestinations() renvoie chaque destination nommée enregistrée dans le document — utile pour vérifier que chaque cible de repère et chaque lien de la table des matières résolvent réellement à une page existante:
const destNames = new Set(doc.GetNamedDestinations().map((d) => d.name));
const walk = (nodes: OutlineItem[]): void => {
for (const item of nodes) {
if (item.Dest && 'name' in item.Dest) {
console.log(destNames.has(item.Dest.name), item.Title);
}
if (item.Children) walk(item.Children);
}
};
walk(doc.GetOutlines());Étape 6: Construire un arbre de structure balisée
Document.GetStructTree() renvoie l’arborescence de structure existante (ou null si le document n’a pas été balisé). StructTreeRoot.Append(tag) ajoute un élément enfant tel que 'H2' ou 'P' et renvoie un StructElement, et StructElement.MarkContent(page, quad) associe cet élément au contenu de la page qu’il décrit :
function tagPage(doc: Document, page: Page, headingText: string): void {
const root = doc.GetStructTree();
if (!root) throw new Error('tagPage: the document is not tagged yet');
for (const block of page.GetStructuredText()) {
const text = block.text.trim();
if (text.length === 0) continue;
const el = root.Append(text.startsWith(headingText) ? 'H2' : 'P');
el.MarkContent(page, block.quad);
}
}Problèmes courants et solutions
Document.GetStructTree() returns null. Le document n’a pas encore été étiqueté — appelez Document.CreateStructTree() (ou Document.AutoTag()) avant de créer manuellement des éléments avec StructTreeRoot.Append() / StructElement.MarkContent().
Un élément de plan ne saute pas à la bonne page. OutlineItem.Dest doit nommer une destination qui existe réellement — vérifiez item.Dest.name against Document.GetNamedDestinations() avant d’enregistrer, comme indiqué à l’étape 5.
Page.AddTOC() les entrées pointent vers la mauvaise page. page dans chaque entrée de TOC, le numéro de page propre à la page cible — confirmez-le avec page.Number sur la cible réelle Page, pas un indice de tableau supposé.
Les signets disparaissent après un appel ultérieur Document.SetOutlines() appel. SetOutlines() remplace l’arbre complet des signets — lisez l’arbre actuel avec Document.GetOutlines() d’abord, modifiez le tableau, puis renvoyez le tableau complet si des signets sont ajoutés plutôt que remplacés.
Foire aux questions
Un signet peut-il s’ouvrir déjà déplié?
Oui — définissez Open: true sur le OutlineItem pour que les enfants de ce nœud soient visibles par défaut dans le panneau des signets.
Quelle est la différence entre un signet et une destination nommée?
Un signet (OutlineItem) est une entrée visible dans le panneau de navigation; une destination nommée (Document.GetNamedDestinations() / SetNamedDestination()) est une cible de page interne et réutilisable vers laquelle un signet, une entrée de table des matières ou une annotation de lien peuvent tous pointer par son nom.
L’étiquetage d’un document affecte-t-il son apparence?
Non — un arbre de structure (StructTreeRoot, StructElement) est une couche logique parallèle décrivant l’ordre de lecture et la sémantique; il ne modifie pas le contenu visible de la page.
Puis-je imbriquer des signets?
Oui — définissez Children sur un OutlineItem avec un tableau d’objets OutlineItem supplémentaires pour créer un arbre pliable à plusieurs niveaux.