Structure
Structure
Αυτή η σελίδα καλύπτει την πλοήγηση εγγράφου και τη λογική δομή: περιγράμματα (σελιδοδείκτες), πίνακες περιεχομένων, ονομαστικούς προορισμούς και το δέντρο δομής με ετικέτες που χρησιμοποιείται για προσβασιμότητα και επαναρροή.
Περιγράμματα (Σελιδοδείκτες)
Document.GetOutlines() επιστρέφει το τρέχον δέντρο περιγραμμάτων ως OutlineItem[] ([] όταν δεν υπάρχει /Outlines); Document.SetOutlines() το αντικαθιστά — η παροχή του [] αφαιρεί εντελώς το περίγραμμα. Κάθε OutlineItem έχει ένα Title, ένα Dest (αριθμό σελίδας ή ονομαστικό προορισμό), προαιρετικό Children για εμφώλευση, και στυλ (Color, Bold, Italic, Open).
const items: OutlineItem[] = sections.map((s) => {
const item: OutlineItem = { Title: s.title, Dest: { name: s.dest } };
if (s.subtype === 'sales') {
item.Open = true;
item.Children = ['Pasta', 'Pizza', 'Antipasti']
.map((cat) => ({ Title: cat, Dest: { name: s.dest } }));
}
return item;
});
doc.SetOutlines(items);Πίνακας Περιεχομένων
Page.AddTOC() απεικονίζει μια λίστα από αντικείμενα TOCEntry — καθένα με ένα title και έναν αριθμό στόχο page — σε ένα ορθογώνιο σε μια σελίδα, με αναδιπλωμένους τίτλους, κουκίδες-οδηγούς και ετικέτες σελίδας ευθυγραμμισμένες δεξιά. Επιστρέφει ένα AddTOCResult που αναφέρει πόσες καταχωρήσεις σχεδιάστηκαν και, όταν το κουτί είναι πολύ μικρό, το remainder που δεν χωράει.
page.AddTOC(
sections.map((s, i) => ({ title: `${i + 1}. ${s.title}`, page: s.page.Number })),
[72, 160, 400, 400],
{ font: 'Helvetica', fontSize: 13, rowGap: 18 },
);Ονομαστικοί Προορισμοί
Document.GetNamedDestinations() επιστρέφει κάθε προορισμό με όνομα — συγχωνεύοντας το δέντρο ονομάτων /Names /Dests και το κληρονομικό λεξικό /Dests — ως ζεύγη { name, dest }, όπου το dest είναι ένα PageDest ({ page, view }). Αυτά είναι οι ίδιοι ονομαστικοί στόχοι που ένα OutlineItem.Dest ή μια σημείωση συνδέσμου μπορούν να αναφερθούν με όνομα αντί για έναν σαφή αριθμό σελίδας.
const destNames = new Set(doc.GetNamedDestinations().map((d) => d.name));
for (const { name, dest } of doc.GetNamedDestinations()) {
console.log(name, '-> page', dest.page);
}Δέντρο Δομής Επισήμανσης
Document.AutoTag() εξάγει και δημιουργεί ένα /StructTreeRoot από τη διάταξη της σελίδας — επικεφαλίδες με ομαδοποίηση κατά μέγεθος γραμματοσειράς, παραγράφους με μπλοκ κειμένου, πίνακες με γεωμετρία γραμμών, και αποφάσεις /Figure έναντι /Artifact ανά εικόνα — και επιστρέφει ένα AutoTagReport με μετρήσεις για κάθε είδος στοιχείου. Το Document.GetStructTree() διαβάζει το προκύπτον StructTreeRoot, ή το null όταν το έγγραφο δεν είναι επισημασμένο.
const report = doc.AutoTag({ lang: 'en-US', title: 'Quarterly Report', tables: true });
console.log(report.headings, report.paragraphs, report.tables, report.figures);
const tree = doc.GetStructTree();
console.log(tree ? tree.GetText() : '(no structure tree)');Το περιεχόμενο που προστίθεται μετά την εκτέλεση του AutoTag() — για παράδειγμα μια σελίδα που συμπληρώθηκε αργότερα — δεν καλύπτεται από αυτή τη διέλευση και δεν θα επισημανθεί διπλά. Τα StructTreeRoot.Append() και StructElement.MarkContent() είναι οι χειροκίνητες API συγγραφής παράλληλα με τη θεωρητική: το Append() προσθέτει ένα στοιχείο-παράγωγο συγκεκριμένου τύπου, και το MarkContent() σηματοδοτεί μια περιοχή της σελίδας ως ανήκουσα σε αυτό το στοιχείο.
Συμβουλές και Καλές Πρακτικές
- Εκτελέστε το
Document.AutoTag()μία φορά, αφού το περιεχόμενο της σελίδας είναι τελικό — δεν επαναεπισημαίνει το περιεχόμενο που προστίθεται αργότερα, οπότε επισημάνετε χειροκίνητα ό,τι προστεθεί αργότερα μεStructTreeRoot.Append()/StructElement.MarkContent(). - Πέρατε το
opts.titleστοAutoTag()— θέτει επίσης το/ViewerPreferences /DisplayDocTitle, το οποίο το PDF/UA απαιτεί μαζί με τον τίτλο του εγγράφου. - Ένα
OutlineItem.Destμπορεί να στοχεύει είτε σε μια σαφώς καθορισμένη σελίδα είτε σε έναν ονομαστικό προορισμό ({ name: '...' }) — χρησιμοποιήστε ονομαστικούς προορισμούς όταν ο αριθμός της σελίδας-στόχου μπορεί να μεταβληθεί καθώς το περιεχόμενο αλλάζει. - Ελέγξτε το
AddTOCResult.remainderόταν η αυτόματη σελιδοποίηση είναι απενεργοποιημένη — ένα πλαίσιο πίνακα περιεχομένων πολύ μικρό για κάθε καταχώρηση σταματά σιωπηρά το σάρωμα αντί να υπερχειλίζει το πλαίσιο.
Συνηθισμένα προβλήματα
| Πρόβλημα | Αιτία | Διόρθωση |
|---|---|---|
Document.GetStructTree() επιστρέφει null | Το έγγραφο δεν έχει επισημανθεί | Καλέστε πρώτα το Document.AutoTag() ή το Document.CreateStructTree() |
| Ο σύνδεσμος ενός στοιχείου του περιγράμματος δεν επιλύεται | Το Dest του ορίζει προορισμό που δεν υπάρχει στο Document.GetNamedDestinations() | Επιβεβαιώστε ότι ο ονομασμένος προορισμός υπάρχει, ή χρησιμοποιήστε μια ρητή σελίδα Dest αντί αυτού |
Page.AddTOC() σταματά πριν από την τελευταία ενότητα | Ο προορισμός rect είναι πολύ μικρός για κάθε καταχώρηση και το autoPaginate είναι εκτός | Μεγαλώστε το rect, περάστε το autoPaginate: true, ή διαχειριστείτε το AddTOCResult.remainder |
Το περιεχόμενο που προστέθηκε μετά το AutoTag() λείπει από το δέντρο δομής | AutoTag() επισημαίνει μόνο το περιεχόμενο που υπήρχε όταν εκτελέστηκε | Επισημάνετε χειροκίνητα το μεταγενέστερο περιεχόμενο με StructTreeRoot.Append() / StructElement.MarkContent() |
FAQ
Πώς προσθέτω σελιδοδείκτες σε ένα PDF;
Δημιουργήστε έναν πίνακα αντικειμένων OutlineItem (Title, Dest, προαιρετικό Children) και περάστε το στο Document.SetOutlines().
Μπορεί ένας πίνακας περιεχομένων να εκτείνεται σε πολλές σελίδες;
Ναι — περάστε το autoPaginate: true στις επιλογές του Page.AddTOC(), ή ελέγξτε το AddTOCResult.remainder και καλέστε ξανά το AddTOC() σε μια νέα σελίδα για ό,τι δεν χωράει.
Πώς κάνω ένα PDF προσβάσιμο (με ετικέτες);
Καλέστε το Document.AutoTag(), το οποίο εξάγει τίτλους, παραγράφους, πίνακες και εικόνες από τη διάταξη της σελίδας. Για περιεχόμενο που προστίθεται μετά, ή όταν το αποτέλεσμα της ευρετικής χρειάζεται διόρθωση, χρησιμοποιήστε απευθείας τα StructTreeRoot.Append() και StructElement.MarkContent() απευθείας.
Ποια είναι η διαφορά μεταξύ προορισμού με αριθμό σελίδας και ονομαστικού προορισμού;
Ένας προορισμός με αριθμό σελίδας (PageDest) στοχεύει σε μια σαφώς καθορισμένη σελίδα με αρίθμηση που ξεκινά από το 1. Ένας ονομαστικός προορισμός (NamedDest) στοχεύει σε ένα όνομα που ένας προβολέας επιλύει μέσω των δικών του πινάκων ονομαστικών προορισμών του εγγράφου — χρήσιμο όταν η σελίδα-στόχος μπορεί να μετακινηθεί.
API Reference Σύνοψη
| Κλάση/Μέθοδος | Περιγραφή |
|---|---|
Document.GetOutlines() / Document.SetOutlines() | Διαβάστε ή αντικαταστήστε το δέντρο περιγράμματος (σελιδοδείκτη) του εγγράφου |
OutlineItem | Ένας κόμβος περιγράμματος: Title, Dest, προαιρετικό Children |
Page.AddTOC() | Αποδώστε έναν πίνακα περιεχομένων σε ένα ορθογώνιο σελίδας |
TOCEntry / AddTOCResult | Δεδομένα μιας γραμμής TOC και το αποτέλεσμα της σχεδίασής της |
Document.GetNamedDestinations() | Καταγράψτε κάθε ονομασμένο προορισμό στο έγγραφο |
Document.AutoTag() | Συμπεράνετε και δημιουργήστε ένα δέντρο δομής με ετικέτες από τη διάταξη της σελίδας |
Document.GetStructTree() / Document.CreateStructTree() | Διαβάστε ή δημιουργήστε το StructTreeRoot του εγγράφου |
StructTreeRoot.Append() / StructElement.Append() / StructElement.MarkContent() | Δημιουργήστε ή επεκτείνετε το δέντρο δομής χειροκίνητα |