Jak pracovat se strukturou PDF v TypeScript

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 build

Ověř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.

Viz také:

 Čeština