ย้ายจาก mPDF ไปยัง NextPDF
ภาพรวมโดยย่อ
หัวข้อที่มีชื่อว่า “ภาพรวมโดยย่อ”คู่มือนี้ช่วยย้ายฐานโค้ดที่ใช้ mPDF ไปยัง NextPDF core ใน mPDF การเรียกเนื้อหาหลักคือ WriteHTML() ซึ่งจับคู่โดยตรงกับ Document::writeHtml() งานส่วนใหญ่คือการจับคู่ config-array ของ constructor (mPDF ตั้งค่าทุกอย่างผ่าน associative array หนึ่งชุดที่ส่งให้ new Mpdf([...])) และการจัดการความแตกต่างด้านฟอนต์ NextPDF และ mPDF เป็นเอนจินที่เป็นอิสระต่อกัน ดังนั้นเอกสารที่ย้ายระบบแล้วจึง เข้ากันได้กับ ผลลัพธ์ของ mPDF แต่ไม่เหมือนกันทุกไบต์ คู่มือนี้ครอบคลุมการจับคู่ verb การจับคู่ config-array ความแตกต่างของฟอนต์ ความแตกต่างของการรองรับ Cascading Style Sheets (CSS) ความแตกต่างเชิงพฤติกรรม และลำดับการดำเนินงานที่ปลอดภัย
ตารางการรองรับ Cascading Style Sheets (CSS) ระบุว่าฟีเจอร์ Hypertext Markup Language (HTML) และ CSS ใดบ้างที่ Verified คู่มือนี้อธิบายพฤติกรรม แต่ไม่ได้ยืนยันความเทียบเท่าเชิงภาพกับ mPDF
การติดตั้ง
หัวข้อที่มีชื่อว่า “การติดตั้ง”composer require nextpdf/core:^3คงการติดตั้ง mpdf/mpdf ไว้ระหว่างการย้ายระบบ แล้วจึงนำออกหลังจาก cutover ครั้งสุดท้าย (ดู ลำดับการย้ายระบบที่ปลอดภัย)
ภาพรวมเชิงแนวคิด
หัวข้อที่มีชื่อว่า “ภาพรวมเชิงแนวคิด”อ็อบเจกต์ Mpdf ของ mPDF รวมการตั้งค่าและการเรนเดอร์ไว้หลังอินเทอร์เฟซเดียว array ใน constructor ทำหน้าที่ตั้งค่า ส่วน WriteHTML() ร่วมกับ verb สำหรับการแบ่งหน้า (AddPage, SetHTMLHeader, SetHTMLFooter) เป็นตัวขับเคลื่อน NextPDF แยกการตั้งค่าออกไปไว้ใน value object ที่ไม่เปลี่ยนแปลงได้ NextPDF\Core\Config และเขียนเนื้อหาด้วย Document::writeHtml() ไม่มีสตริง “mode” ใน constructor NextPDF แยกวิเคราะห์ HTML ที่คุณส่งเข้ามา จากนั้นจึงสร้างเอกสารด้วย save(), output() หรือ getPdfData() ได้
ฟอนต์: mPDF มาพร้อมไดเรกทอรีฟอนต์ แผนที่ fontdata และชุดฟอนต์สำรอง “core fonts” NextPDF เลือกฟอนต์จากไดเรกทอรีฟอนต์เดียวร่วมกับการจับคู่ CSS font-family และทำการ subset ฟอนต์ที่ฝัง เสมอ (International Organization for Standardization (ISO) 32000-2 §9, iso32000_2_sec9#x1.x45.p7) การจับคู่ฟอนต์และการสำรองฟอนต์ขึ้นอยู่กับเอนจิน (CSS Fonts 4 §5.5, css_fonts_4#x1.x5.x5.x1.p13) ดังนั้นการแทนที่ glyph จึงอาจแตกต่างกันได้ นี่คือความแตกต่างหลักที่มองเห็นได้ ซึ่งอธิบายเพิ่มเติมใน ความแตกต่างของการจัดการฟอนต์
พื้นผิว API
หัวข้อที่มีชื่อว่า “พื้นผิว API”API ของ HTML ใน NextPDF มีเอกสารอยู่ในเอกสารอ้างอิง โมดูล Html จุดเข้าใช้งานหลักคือ Document::createStandalone(), Document::writeHtml(string $html): static, Document::writeHtmlCell(...), Document::addPage(), Document::output(?string, OutputDestination), Document::save(string $path): void, Document::getPdfData(): string และ value object NextPDF\Core\Config
การจับคู่ verb ของ API
หัวข้อที่มีชื่อว่า “การจับคู่ verb ของ API”ชื่อเมธอดสาธารณะของ mPDF ด้านล่างได้รับการยืนยันกับ public repository ต้นทาง (mpdf/mpdf, development) ดู provenance sidecar _source-sidecar-upstream-api.md ภายใน repository โดยไม่มีการคัดลอกข้อความเอกสารต้นทางมาแสดง
| mPDF | NextPDF | หมายเหตุ |
|---|---|---|
new Mpdf([...]) | Document::createStandalone($config) | config array ของ mPDF จับคู่กับ NextPDF\Core\Config ดู การจับคู่ config ใช้ DocumentFactory สำหรับ worker ที่ทำงานเป็นเวลานาน |
$mpdf->WriteHTML($html) | $doc->writeHtml($html) | จับคู่โดยตรง อาร์กิวเมนต์ตัวที่สอง $mode ของ mPDF (ทั้งเอกสาร เทียบกับ CSS อย่างเดียว เทียบกับ element) ไม่มีสิ่งเทียบเท่าใน NextPDF ให้ส่ง HTML ที่สมบูรณ์ |
$mpdf->WriteFixedPosHTML(...) | $doc->writeHtmlCell(...) | พื้นที่ HTML ที่กำหนดตำแหน่งและขนาด โดยจับคู่อาร์กิวเมนต์ x/y/width/height |
$mpdf->AddPage(...) | $doc->addPage() | NextPDF ไม่รับการแทนที่ orientation/format/margin แบบต่อการเรียกของ mPDF เป็นอาร์กิวเมนต์ ให้เปลี่ยนโมเดลเอกสารระหว่างการเรียกแทน |
$mpdf->SetHTMLHeader($html) / SetHTMLFooter($html) | header/footer ผ่าน Layout API | running HTML headers ของ mPDF จับคู่กับกลไก header/footer ของ NextPDF ไม่ใช่ HTML แบบ inline ที่ส่วนบนสุดของ body |
$mpdf->Output($name, $dest) | $doc->output($name, OutputDestination::…) | อักขระปลายทางของ mPDF (I/D/F/S) จับคู่กับ enum OutputDestination (Inline/Download/file ผ่าน save()/string ผ่าน getPdfData()) |
$mpdf->Output('','S') | $doc->getPdfData() | คืนค่าเป็นไบต์ |
$mpdf->Output($path,'F') | $doc->save($path) | เขียนไปยังพาธของไฟล์ |
$mpdf->SetTitle($t) | $doc->setTitle($t) | ลงเอยใน information dictionary / Extensible Metadata Platform (XMP) ของ ISO 32000-2 §14 (iso32000_2_sec14#x1.x5.p5) |
$mpdf->SetProtection($perms,...) | $doc->setEncryption(...) (Security API) | สิทธิ์เป็นแบบที่อาศัยความร่วมมือของโปรแกรมอ่าน ไม่ใช่การควบคุมการเข้าถึง ดู หมายเหตุด้านความปลอดภัย |
ตัวอย่างโค้ด — เริ่มต้นอย่างรวดเร็ว
หัวข้อที่มีชื่อว่า “ตัวอย่างโค้ด — เริ่มต้นอย่างรวดเร็ว”<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
// mPDF:// $mpdf = new \Mpdf\Mpdf();// $mpdf->WriteHTML('<h1>Invoice</h1>');// $mpdf->Output('out.pdf', \Mpdf\Output\Destination::FILE);
// NextPDF — default page is A4 portrait:$doc = Document::createStandalone();$doc->setTitle('Invoice');$doc->addPage();$doc->writeHtml('<h1>Invoice</h1>');$doc->save(__DIR__ . '/out.pdf');
echo "Wrote out.pdf\n";ตัวอย่างโค้ด — สำหรับการใช้งานจริง
หัวข้อที่มีชื่อว่า “ตัวอย่างโค้ด — สำหรับการใช้งานจริง”ตัวอย่างนี้สอดคล้องกับ examples/04-text-and-fonts.php ซึ่งเป็นโค้ดที่รันได้และรองรับแนวคิดการจัดการฟอนต์ในคู่มือนี้ ตัวอย่างนี้ใช้ขนาดหน้า margin และ body ของเนื้อหาที่ทดสอบการเลือกฟอนต์อย่างชัดเจน
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Contracts\OutputDestination;use NextPDF\Core\Config;use NextPDF\Core\Document;use NextPDF\ValueObjects\Margin;use NextPDF\ValueObjects\PageSize;
// Equivalent of: new Mpdf(['format'=>'A4','margin_left'=>20, ...]).// Margin constructor order is (top, right, bottom, left) — NOT L,R,T,B.$config = new Config( pageSize: new PageSize(595.276, 841.890, 'A4'), margins: new Margin(16.0, 20.0, 16.0, 20.0), // top,right,bottom,left in points fontsDirectory: __DIR__ . '/fonts',);
$doc = Document::createStandalone($config);$doc->setTitle('Quarterly Report');$doc->addPage();
$html = <<<'HTML'<h1 style="font-family:'DejaVu Sans';color:#1E3A8A;">Quarterly Report</h1><p>Body text resolves through CSS font-family matching against the configuredfonts directory. mPDF's fontdata map has no direct analogue — register thefamily via CSS and the fonts directory instead.</p>HTML;
$doc->writeHtml($html);
// Equivalent of $mpdf->Output('report.pdf', Destination::DOWNLOAD):$doc->output('report.pdf', OutputDestination::Download);กรณีขอบและข้อควรระวัง
หัวข้อที่มีชื่อว่า “กรณีขอบและข้อควรระวัง”- อาร์กิวเมนต์
$modeในWriteHTMLWriteHTML($html, $mode)ของ mPDF (2 = CSS อย่างเดียว, 1 = element) ไม่มีสิ่งเทียบเท่า ใส่ CSS ลงใน HTML ที่คุณส่ง ไม่มีลำดับ “เขียน CSS ก่อนแล้วจึงเขียน body” - การแทนที่แบบต่อ
AddPage. mPDF ยอมให้AddPage()เปลี่ยน format/orientation กลางเอกสารด้วยอาร์กิวเมนต์ NextPDFaddPage()ไม่รับอาร์กิวเมนต์เช่นนั้น การเปลี่ยนขนาดถูกกำหนดผ่านโมเดลเอกสาร ไม่ใช่ผ่านการเรียกหน้า - HTML ของ header/footer. mPDF ลงทะเบียน running headers เป็น HTML fragment แยกต่างหาก อย่าวางลงใน body จับคู่สิ่งเหล่านี้กับกลไก NextPDF header/footer
- ชื่อฟอนต์. mPDF ทำให้ชื่อฟอนต์เป็นมาตรฐานผ่านตาราง
fontdata/core-font ของตน NextPDF จับคู่ CSSfont-familyกับไดเรกทอรีฟอนต์ alias ของ mPDF ที่เคยเลือกได้อย่างเงียบๆ อาจต้องระบุ@font-face/family - อักขระปลายทาง.
'I'/'D'/'F'/'S'ไม่ได้รับการยอมรับ ให้ใช้ enumOutputDestinationหรือsave()/getPdfData()แทน
ประสิทธิภาพ
หัวข้อที่มีชื่อว่า “ประสิทธิภาพ”writeHtml() ทำงานแบบ single-pass (ADR-001) หน่วยความจำสูงสุดแปรผันตามขนาดเอกสาร ไม่ใช่ Document Object Model (DOM) ที่ถูกเก็บไว้ งบประมาณสำหรับตัวอย่างในคู่มือนี้คือ wall_ms: 2000, peak_mb: 128 สำหรับเอกสารยาว ให้แบ่งเนื้อหาออกตามการเรียก addPage() แทนการส่งสตริงขนาดใหญ่ก้อนเดียว นี่เป็นแนวทางเดียวกับการแบ่งส่วนด้วย $mode ของ mPDF แต่แสดงผ่านโมเดลหน้า
หมายเหตุด้านความปลอดภัย
หัวข้อที่มีชื่อว่า “หมายเหตุด้านความปลอดภัย”- สิทธิ์เป็นแบบที่อาศัยความร่วมมือของโปรแกรมอ่าน.
SetProtection()→setEncryption()ให้การรักษาความลับ ไม่ใช่การควบคุมการเข้าถึง: บิตสิทธิ์ของ ISO ขึ้นอยู่กับโปรแกรมอ่านที่ให้ความร่วมมือ อย่านำเสนอการเข้ารหัสลับต่อผู้ใช้ว่าเป็นการควบคุมการเข้าถึง - ข้อมูลเมตา.
SetTitle()และข้อมูลเอกสารลงเอยใน information dictionary / XMP ของ ISO 32000-2 §14 (iso32000_2_sec14#x1.x5.p5) อย่าเก็บความลับไว้ที่นั่น - NextPDF ไม่รันสคริปต์ในเอกสาร ไม่มี directive ของ mPDF ที่เปลี่ยนพฤติกรรมนี้
ความสอดคล้อง
หัวข้อที่มีชื่อว่า “ความสอดคล้อง”| ข้อความ | ข้อกำหนด | มาตรา | รหัสอ้างอิง (reference_id) |
|---|---|---|---|
| ฟอนต์ถูกเขียนเป็น embedded/subset font program | ISO 32000-2 | §9 | |
| format/margins ของหน้าจับคู่กับ page boundary box | ISO 32000-2 | §7 | |
| ข้อมูลเมตาของ Title / protection ลงเอยใน info dictionary / XMP | ISO 32000-2 | §14 | |
| การจับคู่ฟอนต์ / การสำรองฟอนต์ขึ้นอยู่กับเอนจิน | CSS Fonts 4 | §5.5 |
NextPDF สร้างเนื้อหาแบบ ISO 32000-2 แต่ไม่ได้ยืนยันความเหมือนกันเชิงภาพกับ mPDF ตรวจทานผลลัพธ์ใหม่ทุกครั้งที่คุณเปลี่ยน renderer
บริบทเชิงพาณิชย์
หัวข้อที่มีชื่อว่า “บริบทเชิงพาณิชย์”ไม่เกี่ยวข้อง NextPDF core ครอบคลุมเส้นทางการย้ายระบบจาก mPDF ที่อธิบายไว้ในหน้านี้
ดูเพิ่มเติม
หัวข้อที่มีชื่อว่า “ดูเพิ่มเติม”รายละเอียดการย้ายระบบ (ส่วนที่จำเป็นตาม R6)
หัวข้อที่มีชื่อว่า “รายละเอียดการย้ายระบบ (ส่วนที่จำเป็นตาม R6)”คู่มือนี้เหมาะกับใคร
หัวข้อที่มีชื่อว่า “คู่มือนี้เหมาะกับใคร”ทีมที่รัน mpdf/mpdf สำหรับการแปลง HTML เป็น PDF ฝั่งเซิร์ฟเวอร์ หากโค้ดของคุณสร้างอยู่รอบ new Mpdf([...]) + WriteHTML + Output (+ header/footer ตามต้องการ) การจับคู่ verb และ การจับคู่ config จะครอบคลุมกรณีนี้
อยู่ในขอบเขต: config array ใน constructor ของ Mpdf, WriteHTML/Output/AddPage, headers/footers, ฟอนต์, protection, ข้อมูลเมตา นอกขอบเขต: คลาสภายในของ mPDF และพื้นผิว helper ของ Quick Response (QR)/barcode/watermark ให้จับคู่สิ่งเหล่านั้นกับโมดูลที่สอดคล้องกันของ NextPDF ได้แก่ Barcode, Graphics ซึ่งไม่ได้ครอบคลุมในหน้านี้
แผนที่ความเข้ากันได้
หัวข้อที่มีชื่อว่า “แผนที่ความเข้ากันได้”ความเข้ากันได้เชิงพฤติกรรม ไม่ใช่ drop-in shim: NextPDF ไม่มี class shim ของ Mpdf ให้เขียนทุกจุดที่เรียกใช้ใหม่ ใช้แถวที่ Verified ใน ตารางการรองรับ CSS สำหรับความคาดหวังเรื่องฟีเจอร์ CSS
การจับคู่ config-array ของ constructor
หัวข้อที่มีชื่อว่า “การจับคู่ config-array ของ constructor”คีย์การตั้งค่าของ mPDF ด้านล่างได้รับการยืนยันกับ public repository ต้นทาง (mpdf/mpdf, development) ไม่มีการคัดลอกข้อความเอกสารต้นทางมาแสดง
| คีย์การตั้งค่าของ mPDF | NextPDF | หมายเหตุ |
|---|---|---|
mode | (ไม่มีสิ่งเทียบเท่า) | สตริง mode ของ mPDF ('utf-8', 'c', '+aCJK', …) เลือกพฤติกรรม font/script NextPDF เป็น Unicode เสมอ ข้อความ Chinese, Japanese และ Korean (CJK) จัดการด้วยการเลือกฟอนต์ ไม่ใช่ mode ให้ตัดคีย์นี้ออก |
format | Config->pageSize (PageSize อ็อบเจกต์ค่า (VO)) | รูปแบบที่มีชื่อจะกลายเป็นมิติเป็นจุดอย่างชัดเจน array [w,h] จับคู่กับ PageSize ได้ |
orientation | สลับ PageSize width/height | ไม่มี flag สำหรับ orientation แนวนอนหมายถึง width > height |
default_font_size | font-size ฐานของ CSS | ตั้งค่านี้ใน stylesheet ฐานของคุณ ไม่ใช่คีย์ของ constructor |
default_font | CSS font-family / ฟอนต์ที่ลงทะเบียน | ตั้งค่าตระกูลฟอนต์เริ่มต้นผ่าน CSS / การลงทะเบียนฟอนต์ |
margin_left / margin_right / margin_top / margin_bottom | Config->margins (Margin VO) เป็นจุด | ใช้ value object Margin เดียว ลำดับใน constructor คือ Margin(top, right, bottom, left) (ตรวจสอบกับ src/ValueObjects/Margin.php) ไม่ใช่ลำดับคีย์ของ mPDF |
margin_header / margin_footer | ออฟเซ็ต header/footer ผ่าน Layout API | จับคู่สิ่งเหล่านี้กับการตั้งค่า NextPDF header/footer ไม่ใช่คีย์ของ constructor |
ความแตกต่างของการจัดการฟอนต์
หัวข้อที่มีชื่อว่า “ความแตกต่างของการจัดการฟอนต์”- ไดเรกทอรีฟอนต์เดียว. รายการไดเรกทอรีฟอนต์ แผนที่
fontdataและ core-font fallback ของ mPDF ถูกรวมเป็นConfig->fontsDirectoryร่วมกับการจับคู่ CSSfont-family - subset เสมอ. NextPDF ทำ subset ฟอนต์ที่ฝังเสมอ (ISO 32000-2 §9,
iso32000_2_sec9#x1.x45.p7) subset flag ของ mPDF ไม่มีสิ่งเทียบเท่าและไม่จำเป็น - การจับคู่ขึ้นอยู่กับเอนจิน. การจับคู่ฟอนต์และการสำรองฟอนต์แตกต่างกันตามเอนจิน (CSS Fonts 4 §5.5,
css_fonts_4#x1.x5.x5.x1.p13) alias ฟอนต์ของ mPDF อาจต้องระบุ@font-faceหรือชื่อตระกูลที่แน่นอน ตั้ง baseline การเรนเดอร์ glyph ใหม่หลังการย้ายระบบ ความแตกต่างของการแทนที่เป็นสิ่งที่คาดหมายได้ ไม่ใช่ข้อบกพร่อง
ความแตกต่างเชิงพฤติกรรม
หัวข้อที่มีชื่อว่า “ความแตกต่างเชิงพฤติกรรม”- การแทนที่ฟอนต์ (ดูด้านบน) คือความแตกต่างหลักที่มองเห็นได้
- ไม่มี
$modeในWriteHTMLส่ง HTML ที่สมบูรณ์พร้อม CSS แบบ inline - ไม่มีการแทนที่ format แบบต่อ
AddPageการเปลี่ยนขนาดถูกกำหนดผ่านโมเดลเอกสาร - สิทธิ์เป็นแบบที่อาศัยความร่วมมือของโปรแกรมอ่าน (ดู หมายเหตุด้านความปลอดภัย)
- เอนจินการจัดวางที่เป็นอิสระ การตัดบรรทัด / การแบ่งหน้าแตกต่างกันได้ในเนื้อหาที่หนาแน่น ให้ตั้ง baseline ของ visual diff ใหม่
สิ่งเหล่านี้คือความแตกต่างเชิงพฤติกรรมที่บันทึกไว้ ไม่ใช่ข้อบกพร่องของเอนจินใดเอนจินหนึ่ง
ไม่รองรับ / ไม่มีสิ่งเทียบเท่าโดยตรง
หัวข้อที่มีชื่อว่า “ไม่รองรับ / ไม่มีสิ่งเทียบเท่าโดยตรง”- สตริง
modeใน constructor ไม่ได้สร้างแบบจำลอง (เป็น Unicode เสมอ) - อาร์กิวเมนต์แบบต่อ
AddPage()format/orientation/margin ไม่ใช่อาร์กิวเมนต์ใน NextPDF - แผนที่
fontdataของ mPDF แทนที่ด้วยไดเรกทอรีฟอนต์ + การจับคู่ CSS - อักขระปลายทาง
'I'/'D'/'F'/'S'ของ mPDF ถูกแทนที่ด้วย enumOutputDestination+save()/getPdfData()
ลำดับการย้ายระบบที่ปลอดภัย
หัวข้อที่มีชื่อว่า “ลำดับการย้ายระบบที่ปลอดภัย”- เพิ่ม
nextpdf/coreควบคู่กับmpdf/mpdfและคงการติดตั้ง mPDF ไว้ก่อน - เลือกเอกสารที่มีความเสี่ยงต่ำหนึ่งฉบับ แปลง
new Mpdf([...])ผ่าน การจับคู่ config และแปลงWriteHTML/Outputผ่าน การจับคู่ verb - ลงทะเบียนฟอนต์ที่เอกสารใช้ใน
Config->fontsDirectoryและเพิ่มการประกาศ@font-face/family อย่างชัดเจนสำหรับ alias ของ mPDF แต่ละรายการ - สร้าง PDF ทั้งสองชุดสำหรับ input เดียวกันและเปรียบเทียบเชิงภาพ ความแตกต่าง (การแทนที่ฟอนต์ การตัดบรรทัด) เป็นสิ่งที่คาดหมายได้สำหรับเอนจินที่เป็นอิสระ ให้ยอมรับความแตกต่างนั้นเป็นรายเอกสาร
- จับคู่ HTML ของ header/footer ใดๆ กับกลไก NextPDF header/footer
- ทำซ้ำเป็นรายเอกสาร โดยเริ่มจากความเสี่ยงต่ำสุดก่อน คงการติดตั้ง mPDF ไว้จนกว่าจะถึง cutover ครั้งสุดท้าย
- นำ
mpdf/mpdfออกจากcomposer.jsonหลังจาก cutover ครั้งสุดท้าย
การทดสอบการย้ายระบบ
หัวข้อที่มีชื่อว่า “การทดสอบการย้ายระบบ”- ถ่าย snapshot ผลลัพธ์ของ mPDF สำหรับเอกสารตัวแทนก่อนเปลี่ยนโค้ด (golden inputs ไบต์จะแตกต่างกัน)
- สำหรับเอกสารที่ย้ายระบบแล้วแต่ละฉบับ ให้ยืนยันการยอมรับด้วยการตรวจสอบของคุณเอง (visual diff + การสกัดข้อความ) พฤติกรรมด้านฟอนต์/HTML ของ NextPDF ถูกทดสอบโดย
examples/04-text-and-fonts.phpและexamples/08-html-basic.phpร่วมกับชุดทดสอบtests/Html/Font ของ core การยอมรับการย้ายระบบขึ้นอยู่กับเอกสารแต่ละฉบับและยังคงเป็นความรับผิดชอบของคุณ - เพิ่ม regression test ต่อเอกสารที่ย้ายระบบแต่ละฉบับ
หลักฐาน / การสืบย้อนกลับ
หัวข้อที่มีชื่อว่า “หลักฐาน / การสืบย้อนกลับ”ทุกข้อความเชิงพฤติกรรมของ NextPDF ในหน้านี้มีการทดสอบใน repository ตัวอย่าง source signature หรือ architecture decision record (ADR) รองรับ หรือในกรณีคุณสมบัติของรูปแบบ PDF จะอ้างอิงมาตรา ISO 32000-2 / CSS ที่ปักหมุดด้วย retrieval-augmented generation (RAG) ใน citations: ของ front-matter และตาราง ความสอดคล้อง พฤติกรรมของ mPDF ถูกยืนยันเฉพาะในฐานะ “เอนจินที่เป็นอิสระ คาดหมายความแตกต่างที่มีการบันทึกไว้” หน้านี้ไม่ได้อ้างความเทียบเท่าใดที่สิ่งประดิษฐ์ใน repository พิสูจน์ไม่ได้
| ข้อความเชิงพฤติกรรมของ NextPDF | หลักฐานในrepository (พาธ) |
|---|---|
WriteHTML() จับคู่โดยตรงกับ Document::writeHtml(string $html): static ได้ | src/Core/Concerns/HasTextOutput.php (writeHtml()); examples/08-html-basic.php ประกอบ |
WriteFixedPosHTML(...) จับคู่กับ writeHtmlCell(...) ได้ | src/Core/Concerns/HasTextOutput.php (writeHtmlCell()) |
createStandalone() หน้าเริ่มต้นคือ A4 แนวตั้ง (595.276 × 841.890 pt) | src/Core/Config.php (PageSize เริ่มต้น); tests/Unit/Core/DocumentCreateStandaloneAndConfigWithersEdgeCaseTest.php ประกอบ |
Margin มีลำดับใน constructor คือ (top, right, bottom, left) ตามลำดับ | src/ValueObjects/Margin.php (ลำดับของ promoted-property) |
ปลายทางผลลัพธ์คือ enum NextPDF\Contracts\OutputDestination 'I'/'D'/'F'/'S' ไม่ได้รับการยอมรับ | src/Contracts/OutputDestination.php (กรณี Inline/Download/File/String); tests/Unit/Core/Concerns/DocumentOutputDestinationDispatchTest.php ประกอบ |
Output('','S') → getPdfData(); Output($path,'F') → save($path) ตามลำดับ | src/Core/Concerns/HasOutput.php (getPdfData(), save(), output()) |
SetProtection() จับคู่กับ setEncryption(...); สิทธิ์เป็นแบบที่อาศัยความร่วมมือของโปรแกรมอ่าน | src/Core/Concerns/HasSecurity.php (setEncryption()); ISO 32000-2 §14 (citations: ใน front-matter) |
SetTitle() → setTitle(); ข้อมูลเมตาลงเอยใน info dictionary / XMP | src/Core/Concerns/HasMetadata.php (setTitle()); tests/Unit/Core/Concerns/DocumentInfoMetadataSetterBaselineTest.php; ISO 32000-2 §14 (citations: ใน front-matter) |
| ฟอนต์ถูกฝังเป็น subset program เสมอ | tests/Unit/Core/Concerns/DocumentTextOutputFontSubsettingAndBorderEdgeCaseTest.php; examples/04-text-and-fonts.php; ISO 32000-2 §9 (citations: ใน front-matter) |
| การจับคู่ฟอนต์ / การสำรองฟอนต์ขึ้นอยู่กับเอนจิน (ความแตกต่างของการแทนที่) | CSS Fonts 4 §5.5 (citations: ใน front-matter + ความสอดคล้อง) |
writeHtml() ทำงานแบบ single-pass หน่วยความจำสูงสุดแปรผันตามขนาดเอกสาร | docs/architecture/adr/ADR-001-stream-based-rendering-pipeline.md. |
การย้อนกลับ
หัวข้อที่มีชื่อว่า “การย้อนกลับ”แพ็กเกจทั้งสองยังคงติดตั้งอยู่จนกว่าจะถึง cutover ครั้งสุดท้าย ดังนั้นการย้อนกลับแบบต่อจุดที่เรียกใช้จึงหมายถึงการคืนจุดที่เรียกใช้นั้นกลับไปยังเส้นทาง mPDF หลังจาก cutover ครั้งสุดท้าย การย้อนกลับหมายถึงการคืนค่า mpdf/mpdf และโค้ดก่อนหน้าจาก version control ไม่มีการย้ายข้อมูลเข้ามาเกี่ยวข้อง
ข้อพิจารณาด้านประสิทธิภาพ
หัวข้อที่มีชื่อว่า “ข้อพิจารณาด้านประสิทธิภาพ”ดู ประสิทธิภาพ โมเดล single-pass ขจัดต้นทุนของบัฟเฟอร์ที่ mPDF เก็บไว้ ต้นทุนใหม่ต่อเอกสารคือการเลือกฟอนต์แบบ eager (ขั้นตอนที่ 3) ซึ่งสามารถ cache ได้ผ่านไดเรกทอรีฟอนต์
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- การคงคีย์
modeไว้และคาดหวังพฤติกรรม CJK จากคีย์นั้น NextPDF ตัดคีย์นี้ออก และ CJK ขึ้นอยู่กับการเลือกฟอนต์ - การส่ง
WriteHTML($html, 2)(โหมด CSS อย่างเดียว) ให้ใช้ CSS แบบ inline แทน - การวาง HTML ของ header/footer ลงใน body
- การคาดหวังให้ alias ของ mPDF เลือกฟอนต์เดียวกันโดยไม่มีตระกูลฟอนต์ที่ระบุชัดเจน
- การคาดหวังผลลัพธ์ byte/pixel-identical (เอนจินเป็นอิสระต่อกัน คู่มือนี้ไม่เคยอ้าง drop-in หรือความเข้ากันได้ 100%)
- การมองว่าตารางการรองรับ CSS เป็นเพียงคำแนะนำ ในขณะที่ตารางนั้นคือแหล่งอ้างอิงฟีเจอร์ที่ Verified