บทนำ

ความสามารถทั้งหมดใน Aspose.PDF FOSS สำหรับ TypeScript จะเข้าถึงได้ผ่านสองคลาส: Document และ Page. Document เป็นเจ้าของการรวบรวมหน้าต่าง ๆ และทุกอย่างที่อยู่ในระดับเอกสาร — metadata, bookmarks, page labels, และการบันทึก/โหลด — ในขณะที่แต่ละ Page ใน doc.Pages เป็นเจ้าของทุกอย่างที่อยู่ในระดับหน้านั้น: เนื้อหา, คำอธิบายประกอบ, และฟิลด์ฟอร์ม. เมื่อคุ้นเคยกับสองคลาสนี้แล้ว ส่วนที่เหลือของพื้นผิวไลบรารี — การแปลง, คำอธิบายประกอบ, ฟอร์ม, ความปลอดภัย — ก็จริง ๆ แล้วเป็นแค่เมธอดเพิ่มเติมบนวัตถุสองอันเดียวกัน.

โพสต์นี้เป็นการมองอย่างละเอียดในส่วนของพื้นผิวหลักที่ introductory post เพียงแค่กล่าวถึงสั้น ๆ: การประกอบเอกสารจากเอกสารอื่น, การสร้างหน้าจากศูนย์, การเพิ่มต้นไม้บุ๊กมาร์กเพื่อการนำทาง, และการแท็กเนื้อหาเพื่อการเข้าถึง. ทั้งสี่เป็นการเรียกเมธอดธรรมดา — ไม่มีโมดูลแยกให้ import, ไม่มีการพึ่งพาเพิ่มเติมนอกจากแพ็กเกจ @asposefoss/pdf เอง.

นี่คือการดำเนินการที่เกิดขึ้นเมื่อสายงาน PDF ผ่านขั้นตอน “เปิดไฟล์หนึ่งไฟล์, แก้ไข, บันทึก” ไปแล้ว: การรวมรายงานจากหลายแหล่งให้เป็นเอกสารเดียว, การสร้างหน้าตามโปรแกรมแทนการเริ่มจากเทมเพลต, และการทำให้ผลลัพธ์สามารถนำทางและเข้าถึงได้ ไม่ใช่แค่ดูสวยเท่านั้น.


สิ่งที่รวมอยู่

การประกอบและจัดเรียงเอกสารใหม่

Document.Split() แบ่งเอกสารออกเป็น Document หน้าเดียวใหม่ต่อหน้า, ตามลำดับหน้า. Document.ExtractPages() คัดลอกชุดเลขหน้าที่เริ่มจาก 1 ที่กำหนดเข้าไปใน Document ใหม่ที่เป็นอิสระ, ตามลำดับที่ให้ — หน้เดียวกันสามารถทำซ้ำได้. หน้าจากเอกสารหนึ่งยังสามารถคัดลอกไปยังอีกเอกสารหนึ่งได้: Document.Append() คัดลอกทุกหน้าของเอกสารต้นทางไปยังท้ายของเป้าหมาย, และ Document.InsertPage() คัดลอกหน้าเดียวข้ามเอกสารที่ตำแหน่งเริ่มจาก 1 เฉพาะ.

import { Document } from '@asposefoss/pdf';

const report = Document.OpenFile('report.pdf');

const parts = report.Split();                      // one Document per page
const chapter = report.ExtractPages([3, 4, 5]);     // subset (1-based, repeats allowed) as a new Document

const cover = Document.OpenFile('cover.pdf');
report.InsertPage(1, cover.Pages[0]);               // copy a single page across documents
report.Append(chapter);                             // copy chapter's pages onto report

report.WriteTo('assembled.pdf');

หลายเอกสารก็สามารถรวมเป็นหนึ่งไฟล์ได้ในคำเรียกเดียวด้วย Document.Merge() ซึ่งจะสร้าง Document ใหม่จากสำเนาของทุกหน้าของทุกเอกสารที่ส่งให้มันตามลำดับ.

สร้างหน้าใหม่จากศูนย์

Document.New() สร้างเอกสารจากศูนย์: ศูนย์หน้าเมื่อไม่มีการระบุรูปแบบ, หรือหนึ่งหน้าว่างของ PageFormat ที่ระบุเมื่อมีการส่งค่าเข้ามา. หน้าเปล่าเพิ่มเติมมาจาก Document.AddPage(), ซึ่งยังรับค่า PageFormat (หรือ Page ที่มีอยู่เพื่อคัดลอกขนาด). ข้อความจะถูกวาดลงบนหน้าด้วย Page.AddText(), ตั้งตำแหน่งที่จุด (x, y) ในพื้นที่ผู้ใช้ของ PDF.

import { Document, PageFormat } from '@asposefoss/pdf';

const doc = Document.New(PageFormat.A4);          // one blank A4 page
doc.Pages[0].AddText('Hello', 72, 720, { fontSize: 14 });
doc.AddPage(PageFormat.A4.landscape());           // append more as you go
doc.WriteTo('scratch.pdf');

บุ๊กมาร์กและการนำทางเอกสาร

โครงร่างของเอกสาร (แผงบุ๊กมาร์กที่โปรแกรมอ่าน PDF ส่วนใหญ่แสดงเคียงกับหน้า) ถูกอ่านด้วย Document.GetOutlines() และถูกแทนที่ทั้งหมดด้วย Document.SetOutlines(), แต่ละตัวทำงานกับต้นไม้ของค่า OutlineItem. แต่ละ OutlineItem มี Title, ปลายทาง Dest, และอาจมี Children สำหรับรายการย่อย, พร้อมกับเคล็ดลับการแสดงผลเช่น Open (เปิดขยายโดยค่าเริ่มต้น) และ Bold.

import { Document, OutlineItem } from '@asposefoss/pdf';

const items: OutlineItem[] = [
  { Title: 'Introduction', Dest: { name: 'intro' } },
  {
    Title: 'Chapters',
    Open: true,
    Children: [
      { Title: 'Chapter 1', Dest: { name: 'ch1' } },
      { Title: 'Chapter 2', Dest: { name: 'ch2' } },
    ],
  },
];
doc.SetOutlines(items);

ปลายทางที่ตั้งชื่อนี้ ({ name: 'intro' }) จะถูกแก้ไขผ่านตารางปลายทางที่ตั้งชื่อของเอกสาร, ซึ่ง Document.GetNamedDestinations() และ Document.SetNamedDestination() จัดการโดยตรงเมื่อบุ๊กมาร์กต้องชี้ไปยังปลายทางที่ไม่ได้เชื่อมโยงกับเนื้อหาของหน้า.

ข้อความโครงสร้างและการแท็กเพื่อการเข้าถึง

Document.GetStructTree() คืนต้นไม้โครงสร้างตรรกะของเอกสาร (หรือ null เมื่อเอกสารไม่ได้ถูกแท็ก), และ Document.CreateStructTree() สร้างต้นไม้หนึ่ง, ทำเครื่องหมายเอกสารว่าเป็น Tagged. เมื่อมีต้นไม้โครงสร้างแล้ว, Page.GetStructuredText() คืนข้อความของหน้าเป็นค่า TextBlock — ส่วนที่มีตำแหน่งซึ่งจัดกลุ่มเป็นบรรทัดและบล็อกลักษณะย่อหน้าแล้ว — ซึ่งเป็นข้อมูลที่ขั้นตอนการแท็กด้วยมือทำงานจาก: เดินผ่านบล็อกต่างๆ, ตัดสินว่าอันไหนเป็นหัวเรื่องหรือเป็นข้อความหลัก, แล้วเพิ่มองค์ประกอบที่สอดคล้องเข้าไปในต้นไม้.

function handTagPage(doc: Document, page: Page, heading: string): void {
  const root = doc.GetStructTree();
  if (!root) throw new Error('handTagPage: 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(heading) ? 'H2' : 'P');
    el.MarkContent(page, block.quad);
  }
}

ต้นไม้โครงสร้างที่มีแท็กเป็นสิ่งที่ฟีเจอร์ต่อไปอิงไว้: การส่งออกเชิงความหมาย HTML จะทำการรีโฟลว์จากมันแทนที่จะย้อนกลับไปใช้การจัดวางแบบเชิงอัตโนมัติธรรมดา, และ Document.ValidatePdfUa() ตรวจสอบเอกสารกับส่วนย่อยของมาตรฐานการเข้าถึง PDF/UA ที่ขึ้นอยู่กับการมีแท็ก.


เริ่มต้นอย่างเร็ว

ติดตั้งแพกเกจ, จากนั้นเปิดเอกสาร, ดึงออกและรวมส่วนย่อยของหน้าต่าง ๆ ใหม่, และบันทึกผลลัพธ์:

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
import { Document } from '@asposefoss/pdf';

const doc = Document.OpenFile('report.pdf');

const chapter = doc.ExtractPages([3, 4, 5]);   // subset (1-based, repeats allowed) as a new Document
const cover = Document.OpenFile('cover.pdf');

doc.InsertPage(1, cover.Pages[0]);             // copy a single page across documents
doc.Append(chapter);                           // copy chapter's pages onto doc

doc.WriteTo('assembled.pdf');

รูปแบบที่รองรับ

รูปแบบส่วนขยายอ่านเขียน
PDFpdf
Markdownmd
SVGsvg
TIFFtiff
DOCXdocx
HTMLhtml
PNGpng
EPUBepub

โอเพนซอร์ส & ใบอนุญาต

Aspose.PDF FOSS สำหรับ TypeScript ถูกปล่อยภายใต้ใบอนุญาต MIT, โดยซอร์สโค้ดเผยแพร่บน GitHub. ไม่มีลายน้ำการประเมิน, ขีดจำกัดการใช้งาน, หรือไฟล์ใบอนุญาตแยกต่างหากให้จัดการ, และไลบรารีนี้สามารถใช้ในผลิตภัณฑ์เชิงพาณิชย์ได้โดยไม่มีค่าลิขสิทธิ์.

แพกเกจนี้อยู่ในรุ่น 0.1.0 ปัจจุบัน, แสดงถึงการพัฒนาในขั้นต้นที่กำลังดำเนินอยู่. Node.js (>=22) เป็นข้อกำหนดรันไทม์เดียวที่ต้องมี, และแพกเกจนี้ไม่มีการพึ่งพาไลบรารีของบุคคลที่สามอื่น ๆ.


เริ่มต้น

แหล่งข้อมูลที่เกี่ยวข้อง