วิธีทำงานกับโครงสร้าง PDF ใน TypeScript

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

ดูเพิ่มเติม

 ภาษาไทย