วิธีทำงานกับโครงสร้าง 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ตรวจสอบการติดตั้งโดยการนำเข้า class 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 เพิ่มเติมเพื่อสร้างต้นไม้ที่สามารถยุบ/ขยายได้หลายระดับ.