Jak pracovat se strukturou PDF v TypeScript
Tento průvodce ukazuje, jak vytvořit navigaci v dokumentu a logickou strukturu v PDF souborech pomocí Aspose.PDF FOSS pro TypeScript: klikací obsah na stránce, osnovu záložek na úrovni dokumentu, pojmenované destinace a označený strom struktury pro zpřístupnění. 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 po instalaci balíčku vyřešen bez chyby:
import { Document } from '@asposefoss/pdf';Krok 2: Importujte požadované třídy
Importujte Document k otevření souboru a OutlineItem pro položky záložek vytvořené ve Krok 4:
import { Document, OutlineItem } from '@asposefoss/pdf';Krok 3: Přidat obsah
Page.AddTOC() přijímá pole { title, page } položek, ohraničující rect a možnosti stylu; vykresluje tečkované vodítka a klikatelné odkazy na cílové stránky:
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 },
);Krok 4: Přidat záložky
Document.SetOutlines() nahrazuje panel záložek dokumentu polem objektů OutlineItem. Každá položka může nést Dest (cíl stránky), stylování (Color, Bold) a vnořený Children pro sbalitelný strom:
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);Krok 5: Načíst osnovy a pojmenované cíle
Document.GetOutlines() vrací aktuální strom záložek. Document.GetNamedDestinations() vrací každou pojmenovanou destinaci registrovanou v dokumentu — užitečné pro ověření, že každý cíl osnovy a odkaz v obsahu skutečně odkazuje na skutečnou stránku:
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());Krok 6: Vytvořit strom struktury s tagy
Document.GetStructTree() vrací existující strom struktury (nebo null, pokud dokument nebyl označen). StructTreeRoot.Append(tag) přidá podřízený prvek, jako je 'H2' nebo 'P', a vrátí StructElement, a StructElement.MarkContent(page, quad) spojuje tento prvek s obsahem stránky, který popisuje:
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);
}
}Časté problémy a opravy
Document.GetStructTree() returns null. Dokument ještě nebyl označen — zavolejte Document.CreateStructTree() (nebo Document.AutoTag()) před ručním vytvářením prvků s StructTreeRoot.Append() / StructElement.MarkContent().
Položka osnovy nepřejde na správnou stránku. OutlineItem.Dest musí pojmenovat cíl, který skutečně existuje — zkontrolujte item.Dest.name against Document.GetNamedDestinations() před uložením, jak je ukázáno v kroku 5.
Page.AddTOC() záznamy ukazují na špatnou stránku. page v každém záznamu obsahu je číslo stránky cílové stránky — potvrďte to oproti page.Number na skutečném cíli Page, není předpokládaný index pole.
Záložky zmizí po pozdějším Document.SetOutlines() volání. SetOutlines() nahrazuje celý strom záložek — přečtěte aktuální strom pomocí Document.GetOutlines() nejprve, upravte pole, pak vraťte celé pole zpět, pokud jsou záložky přidávány místo nahrazení.
Často kladené otázky
Může záložka být otevřena již rozbalená?
Ano — nastavte Open: true na OutlineItem, aby byly potomci tohoto uzlu ve výchozím nastavení viditelní v panelu záložek.
Jaký je rozdíl mezi záložkou a pojmenovaným cílem?
Záložka (OutlineItem) je viditelná položka v navigačním panelu; pojmenovaný cíl (Document.GetNamedDestinations() / SetNamedDestination()) je interní, znovupoužitelný cíl stránky, na který může odkazovat záložka, položka TOC nebo anotace odkazu pomocí jména.
Ovlivňuje označování dokumentu jeho vzhled?
Ne — struktura stromu (StructTreeRoot, StructElement) je paralelní logická vrstva popisující pořadí čtení a sémantiku; nemění viditelný obsah stránky.
Mohu vnořit záložky?
Ano — nastavte Children na OutlineItem na pole dalších objektů OutlineItem, abyste vytvořili sbalitelný, víceúrovňový strom.