Πώς να εργαστείτε με τη δομή PDF σε TypeScript
Αυτός ο οδηγός δείχνει πώς να δημιουργήσετε πλοήγηση εγγράφου και λογική δομή σε αρχεία PDF με το Aspose.PDF FOSS για TypeScript: έναν κλικ-δυνατό πίνακα περιεχομένων σε μια σελίδα, ένα περίγραμμα σελιδοδεικτών σε επίπεδο εγγράφου, ονομαστικούς προορισμούς και ένα δομημένο δέντρο ετικετών για προσβασιμότητα. Απαιτεί Node.js 22 ή νεότερο.
Οδηγός βήμα-προς-βήμα
Βήμα 1: Εγκατάσταση του πακέτου
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Επιβεβαιώστε την εγκατάσταση εισάγοντας την κλάση Document σε ένα νέο αρχείο TypeScript — αυτή η γραμμή θα πρέπει να λυθεί χωρίς σφάλμα μόλις το πακέτο εγκατασταθεί:
import { Document } from '@asposefoss/pdf';Βήμα 2: Εισαγωγή απαιτούμενων κλάσεων
Εισάγετε το Document για να ανοίξετε το αρχείο και το OutlineItem για τις καταχωρήσεις σελιδοδεικτών που δημιουργήθηκαν στο Βήμα 4:
import { Document, OutlineItem } from '@asposefoss/pdf';Βήμα 3: Προσθέστε έναν Πίνακα Περιεχομένων
Page.AddTOC() λαμβάνει έναν πίνακα από καταχωρήσεις { title, page }, ένα περιοριστικό rect και επιλογές στυλ· δημιουργεί διακεκομμένες γραμμές ηγετών και κλικ-συνδέσμους στις σελίδες-στόχο:
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 },
);Βήμα 4: Προσθέστε Σελιδοδείκτες
Document.SetOutlines() αντικαθιστά το πάνελ σελιδοδεικτών του εγγράφου με έναν πίνακα από αντικείμενα OutlineItem. Κάθε στοιχείο μπορεί να περιέχει ένα Dest (προορισμός σελίδας), στυλ (Color, Bold) και ένθετο Children για ένα αναδιπλούμενο δέντρο:
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);Βήμα 5: Διαβάστε τις Περιγραφές και τους Ονομαστικούς Προορισμούς
Document.GetOutlines() επιστρέφει το τρέχον δέντρο σελιδοδεικτών. Document.GetNamedDestinations() επιστρέφει κάθε ονομαστικό προορισμό που είναι καταχωρημένος στο έγγραφο — χρήσιμο για την επαλήθευση ότι κάθε στόχος περιγραφής και σύνδεσμος Πίνακα Περιεχομένων επιλύεται σε πραγματική σελίδα:
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());Βήμα 6: Δημιουργήστε ένα Δέντρο Δομής με Ετικέτες
Document.GetStructTree() επιστρέφει το υπάρχον δέντρο δομής (ή null εάν το έγγραφο δεν έχει επισημανθεί). StructTreeRoot.Append(tag) προσθέτει ένα στοιχείο-παιδί όπως 'H2' ή 'P' και επιστρέφει ένα StructElement, και StructElement.MarkContent(page, quad) συνδέει αυτό το στοιχείο με το περιεχόμενο της σελίδας που περιγράφει:
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);
}
}Κοινά προβλήματα και διορθώσεις
Document.GetStructTree() returns null. Το έγγραφο δεν έχει ακόμη επισημανθεί — καλέστε Document.CreateStructTree() (ή Document.AutoTag()) πριν από τη χειροκίνητη δημιουργία στοιχείων με StructTreeRoot.Append() / StructElement.MarkContent().
Ένα στοιχείο περιγράμματος δεν πηδά στη σωστή σελίδα. OutlineItem.Dest πρέπει να ονομάσει έναν προορισμό που υπάρχει πραγματικά — ελέγξτε διασταυρώνοντας item.Dest.name against Document.GetNamedDestinations() πριν από την αποθήκευση, όπως φαίνεται στο Βήμα 5.
Page.AddTOC() οι καταχωρήσεις δείχνουν στη λάθος σελίδα. page σε κάθε καταχώριση του Πίνακα Περιεχομένων είναι ο αριθμός σελίδας της σελίδας-στόχου — επιβεβαιώστε το έναντι page.Number στον πραγματικό στόχο Page, όχι έναν υποτιθέμενο δείκτη πίνακα.
Οι σελιδοδείκτες εξαφανίζονται μετά από ένα μεταγενέστερο Document.SetOutlines() κλήση. SetOutlines() αντικαθιστά ολόκληρο το δέντρο σελιδοδεικτών — διαβάστε το τρέχον δέντρο με Document.GetOutlines() πρώτα, τροποποιήστε τον πίνακα, στη συνέχεια περάστε ολόκληρο τον πίνακα πίσω εάν οι σελιδοδείκτες προστίθενται αντί να αντικαθίστανται.
Συχνές Ερωτήσεις
Μπορεί ένα σελιδοδείκτη να ανοίξει ήδη επεκταμένο;
Ναι — ορίστε Open: true στο OutlineItem ώστε τα παιδιά αυτού του κόμβου να είναι ορατά εξ ορισμού στο πάνελ σελιδοδεικτών.
Ποια είναι η διαφορά μεταξύ ενός σελιδοδείκτη και ενός ονομαστικού προορισμού;
Ένας σελιδοδείκτης (OutlineItem) είναι μια ορατή καταχώρηση στον πίνακα πλοήγησης· ένας ονομαστικός προορισμός (Document.GetNamedDestinations() / SetNamedDestination()) είναι ένας εσωτερικός, επαναχρησιμοποιήσιμος στόχος σελίδας που ένας σελιδοδείκτης, μια καταχώρηση TOC ή μια σημείωση σύνδεσμου μπορούν όλοι να επισημάνουν με όνομα.
Επηρεάζει η ετικετοποίηση ενός εγγράφου την εμφάνιση του;
Όχι — ένα δέντρο δομής (StructTreeRoot, StructElement) είναι ένα παράλληλο λογικό επίπεδο που περιγράφει τη σειρά ανάγνωσης και τη σημασιολογία· δεν αλλάζει το ορατό περιεχόμενο της σελίδας.
Μπορώ να ενσωματώσω σελιδοδείκτες;
Ναι — ορίστε Children σε ένα OutlineItem σε έναν πίνακα περαιτέρω αντικειμένων OutlineItem για να δημιουργήσετε ένα αναδιπλούμενο, πολυεπίπεδο δέντρο.