บทนำ
โพสต์แนะนำ introductory post แสดงรูปแบบพื้นฐานของการแปลง: Document.ToHtml(), Document.ToMarkdown() และ Document.ToDocx() ซึ่งแต่ละตัวถูกเรียกโดยไม่มีอาร์กิวเมนต์เพื่อรับค่าเริ่มต้นที่สมเหตุสมผล ทุกเมธอดเหล่านี้รับอ็อบเจ็กต์ options ที่เปลี่ยนผลลัพธ์ที่ได้ — การทำเครื่องหมายแบบเชิงความหมายเทียบกับสำเนาที่คงพิกเซล, เอกสาร Word ที่สามารถรีโฟลว์ได้เทียบกับเอกสารที่จำลองเลย์เอาต์ที่แม่นยำของแต่ละหน้า.
โพสต์นี้ครอบคลุมตัวเลือกเหล่านั้น รวมถึงทิศทางการแปลงที่บทนำไม่ได้กล่าวถึงเลย: การตรวจสอบความถูกต้องของเอกสารตามมาตรฐาน PDF/A, PDF/X และ PDF/UA และการแก้ไขเพื่อให้สอดคล้องกับ Document.ConvertToPdfA() และพี่น้องของมัน.
สิ่งที่รวมอยู่
HTML การส่งออก: เชิงความหมาย vs คงที่
Document.ToHtml() ที่เรียกโดยไม่มีตัวเลือกจะเดินผ่านโครงสร้างต้นไม้ของเอกสารและสร้าง markup ที่สามารถรีโฟลว์ได้ — หัวเรื่องและย่อหน้าที่อ่านได้อย่างเป็นธรรมชาติในเบราว์เซอร์ที่ความกว้างใดก็ได้ โหมดนี้ขึ้นอยู่กับการที่เอกสารถูกทำแท็กก่อน (Document.CreateStructTree() หรือการทำแท็กที่เทียบเท่า); หากไม่มีโครงสร้างต้นไม้ การส่งออกจะย้อนกลับไปใช้เนื้อหาทั่วไปแบบ heuristic แทนการทำ markup เชิงความหมายที่แท้จริง การส่ง { mode: 'fixed', fonts: 'embed' } จะสลับไปใช้กลยุทธ์การเรนเดอร์ที่แตกต่างอย่างสิ้นเชิง: แต่ละหน้าจะกลายเป็น SVG ที่กำหนดตำแหน่งและข้อความที่วางอย่างแน่นอน, โดยฟอนต์ที่ฝังได้ทั้งหมดจะถูกฝังในรูปแบบ base64 WOFF @font-face เพื่อให้หน้าดูเหมือนเดิมโดยไม่ต้องให้ผู้อ่านติดตั้งฟอนต์.
// Semantic mode reflows from the structure tree, so this must run after the
// tagging pass: ToHtml falls back to a heuristic body when GetStructTree() is
// null, and the export loses its heading structure silently.
const semantic = doc.ToHtml();
const fixed = doc.ToHtml({ mode: 'fixed', fonts: 'embed' });
ผลลัพธ์สองแบบมีวัตถุประสงค์ที่แตกต่างกัน: HTML เชิงความหมายเป็นสิ่งที่คุณต้องการสำหรับการอ่านหรือการเผยแพร่เนื้อหาใหม่บนเว็บ, และ HTML คงที่เป็นสิ่งที่คุณต้องการเมื่อเลย์เอาต์ภาพที่แม่นยำของหน้า ต้องคงอยู่โดยไม่ถูกแก้ไขในเบราว์เซอร์.
การส่งออก Word และ Vector
Document.ToDocx() ที่เรียกโดยไม่มีตัวเลือกจะสร้าง .docx ที่มีการไหลใหม่: ย่อหน้าและภาพที่โปรเซสเซอร์คำสามารถจัดบรรทัดใหม่และแก้ไขได้เหมือนเอกสารปกติ การส่ง { mode: 'textbox' } แทนจะรักษาเรขาคณิตของแต่ละหน้าไว้ โดยวางเนื้อหาในกล่องข้อความคงที่แทนที่จะให้มันไหลใหม่ — ใกล้เคียงกับสำเนาภาพที่ตรงตามต้นฉบับมากกว่าที่จะเป็นเอกสารที่แก้ไขได้ Page.ToSvg() จะเรนเดอร์หน้าเดียวเป็นสตริง <svg> แบบสแตนด์อโลน ซึ่งมีประโยชน์เมื่อจำเป็นต้องมีสำเนาเวกเตอร์ที่ไม่ขึ้นกับความละเอียดของหน้าเดียวแทนภาพแรสเตอร์.
import { Document } from '@asposefoss/pdf';
const doc = Document.OpenFile('in.pdf');
const svg = doc.Pages[0].ToSvg(); // standalone <svg> string
const docx = doc.ToDocx(); // .docx bytes, reflowed, images in the package
const fixed = doc.ToDocx({ mode: 'textbox' }); // .docx keeping each page's own geometry
การตรวจสอบและแปลงเป็น PDF/A, PDF/X และ PDF/UA
Document.ValidatePdfA(), Document.ValidatePdfX() และ Document.ValidatePdfUa() แต่ละตัวจะตรวจสอบเอกสารเทียบกับส่วนย่อยที่คัดสรรและตรวจสอบได้โดยเครื่องของมาตรฐานที่สอดคล้อง — PDF/A (ISO 19005) สำหรับการเก็บรักษาระยะยาว, PDF/X (ISO 15930) สำหรับการผลิตพิมพ์, และ PDF/UA (ISO 14289-1) สำหรับการเข้าถึง — และจะคืนค่า ValidationReport พร้อมกับแฟล็ก Passed ที่สรุปผลลัพธ์ Document.ConvertToPdfA() (และที่เทียบเท่า ConvertToPdfX()/ConvertToPdfUa()) จะพยายามแก้ไขเอกสารให้ถึงระดับนั้น แล้วทำการตรวจสอบใหม่อีกครั้ง, คืนค่า ConversionReport ที่รายการว่ามีการดำเนินการใดบ้างที่ได้ทำจริงและปัญหาใดที่ยังคงไม่ได้รับการแก้ไข.
import { Document } from '@asposefoss/pdf';
const doc = Document.OpenFile('in.pdf');
const pdfa = doc.ValidatePdfA('2b');
console.log(`validate: PDF/A-2b ${pdfa.Passed ? 'passes' : 'fails'}`);
// Conversion runs against a copy: the live document is still saved
// unconverted, so ConvertToPdfA must never touch it directly.
const pages = doc.Pages;
const allPages: number[] = [];
for (let i = 1; i <= pages.length; i++) allPages.push(i);
const copy = doc.ExtractPages(allPages);
const conversion = copy.ConvertToPdfA('2b');
console.log(`pdf/a convert: ${conversion.applied.length} action(s) applied, `
+ `${conversion.unresolved.length} unresolved`);
console.log(`result: ${conversion.passed ? 'passes' : 'still fails'} PDF/A-2b`);
การแปลงไม่ได้รับประกันว่าจะถึงความสอดคล้องเต็มรูปแบบในครั้งเดียว — สาเหตุทั่วไปของความล้มเหลวที่คงเหลือรวมถึงฟอนต์ที่ไม่ได้ฝังและการขาด output intent ซึ่งทั้งสองจะแสดงใน conversion.unresolved.
เริ่มต้นอย่างรวดเร็ว
ติดตั้งแพคเกจ แล้วเรนเดอร์หนึ่งหน้เป็น SVG และเอกสารทั้งหมดเป็น HTML ที่ไหลใหม่และ DOCX:
git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-TypeScript.git
cd Aspose.PDF-FOSS-for-TypeScript
npm install
npm run buildimport { Document } from '@asposefoss/pdf';
const doc = Document.OpenFile('in.pdf');
const svg = doc.Pages[0].ToSvg(); // standalone <svg> string
const html = doc.ToHtml(); // reflowable HTML (falls back without a structure tree)
const docx = doc.ToDocx(); // .docx bytes, reflowed, images in the package
// fs.writeFileSync('page1.svg', svg);
// fs.writeFileSync('out.html', html);
// fs.writeFileSync('out.docx', docx);
รูปแบบที่รองรับ
| รูปแบบ | ส่วนขยาย | อ่าน | เขียน |
|---|---|---|---|
| ✓ | ✓ | ||
| Markdown | md | ✓ | ✓ |
| SVG | svg | ✓ | ✓ |
| TIFF | tiff | ✓ | ✓ |
| DOCX | docx | — | ✓ |
| HTML | html | — | ✓ |
| PNG | png | — | ✓ |
| EPUB | epub | — | ✓ |
ซอร์สเปิดและการให้สิทธิ์
Aspose.PDF FOSS สำหรับ TypeScript ถูกปล่อยภายใต้ใบอนุญาต MIT โดยมีซอร์สโค้ดเผยแพร่บน GitHub. ไม่มีลายน้ำการประเมิน, ขีดจำกัดการใช้งาน, หรือไฟล์ใบอนุญาตแยกต่างหากให้จัดการ, และไลบรารีสามารถใช้ในผลิตภัณฑ์เชิงพาณิชย์โดยไม่มีค่าลิขสิทธิ์.
แพ็กเกจในขณะนี้อยู่ที่เวอร์ชัน 0.1.0 ซึ่งสะท้อนการพัฒนาในขั้นต้นที่กำลังดำเนินอยู่. Node.js (>=22) เป็นข้อกำหนดรันไทม์เดียวที่จำเป็น, และแพ็กเกจไม่มีการพึ่งพาจากบุคคลที่สามอื่นใด.