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()Δημιουργήστε ή επεκτείνετε το δέντρο δομής χειροκίνητα

Δείτε επίσης

 Ελληνικά