Structure
Structure
หน้านี้ครอบคลุมการนำทางเอกสารและโครงสร้างเชิงตรรกะ: outlines (bookmarks), tables of contents, named destinations, และ tagged structure tree ที่ใช้สำหรับ accessibility และ reflow.
เค้าโครง (บุ๊กมาร์ก)
Document.GetOutlines() คืนค่าโครงร่างปัจจุบันเป็น OutlineItem[] ([] เมื่อไม่มี /Outlines); Document.SetOutlines() แทนที่มัน — การส่ง [] จะลบโครงร่างออกโดยสิ้นเชิง. แต่ละ OutlineItem มี Title, Dest (หมายเลขหน้า หรือ named destination), ตัวเลือก Children สำหรับ nesting, และ styling (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() renders รายการของ TOCEntry objects — แต่ละที่มี title และ target page number — ลงในสี่เหลี่ยมบนหน้า, พร้อมชื่อเรื่องที่ห่อ, dot leaders, และ right-aligned page labels. มันคืนค่า 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 หรือ annotation ลิงก์สามารถอ้างอิงโดยใช้ชื่อแทนหมายเลขหน้าโดยตรง.
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 vs. /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 สามารถเข้าถึงได้ (tagged) อย่างไร?
เรียก Document.AutoTag() ซึ่งจะสรุปหัวข้อ ย่อหน้า ตาราง และรูปภาพจากการจัดหน้า สำหรับเนื้อหาที่เพิ่มเข้ามาภายหลัง หรือเมื่อผลลัพธ์เชิงปริมาณต้องการการแก้ไข ให้ใช้ StructTreeRoot.Append() และ StructElement.MarkContent() โดยตรง.
ความแตกต่างระหว่างปลายทางแบบหมายเลขหน้าและปลายทางที่ตั้งชื่อคืออะไร?
ปลายทางแบบหมายเลขหน้า (PageDest) ชี้ไปยังหน้าที่ระบุอย่างชัดเจนโดยเริ่มจาก 1. ปลายทางที่ตั้งชื่อ (NamedDest) ชี้ไปยังชื่อที่โปรแกรมดูเอกสารจะค้นหาในตารางปลายทางที่ตั้งชื่อของเอกสารเอง — มีประโยชน์เมื่อหน้าที่เป็นเป้าหมายอาจย้ายตำแหน่ง.
API Reference สรุป
| คลาส/เมธอด | คำอธิบาย |
|---|---|
Document.GetOutlines() / Document.SetOutlines() | อ่านหรือแทนที่โครงร่างเอกสาร (บุ๊กมาร์ก) tree |
OutlineItem | โหนดโครงร่างหนึ่ง: Title, Dest, ไม่บังคับ Children |
Page.AddTOC() | เรนเดอร์สารบัญลงในสี่เหลี่ยมหน้ากระดาษ |
TOCEntry / AddTOCResult | ข้อมูลของแถว TOC และผลลัพธ์ของการวาดมัน |
Document.GetNamedDestinations() | แสดงรายการทุกชื่อปลายทางในเอกสาร |
Document.AutoTag() | สรุปและสร้างต้นไม้โครงสร้างที่มีแท็กจากการจัดหน้า |
Document.GetStructTree() / Document.CreateStructTree() | อ่านหรือสร้าง StructTreeRoot ของเอกสาร |
StructTreeRoot.Append() / StructElement.Append() / StructElement.MarkContent() | เขียนหรือขยายโครงสร้างต้นไม้ด้วยตนเอง |