ข้ามไปยังเนื้อหา

ย้ายจาก 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

Terminal window
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 ของ 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

ชื่อเมธอดสาธารณะของ mPDF ด้านล่างได้รับการยืนยันกับ public repository ต้นทาง (mpdf/mpdf, development) ดู provenance sidecar _source-sidecar-upstream-api.md ภายใน repository โดยไม่มีการคัดลอกข้อความเอกสารต้นทางมาแสดง

mPDFNextPDFหมายเหตุ
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 APIrunning 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 configured
fonts directory. mPDF's fontdata map has no direct analogue — register the
family 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 ใน WriteHTML WriteHTML($html, $mode) ของ mPDF (2 = CSS อย่างเดียว, 1 = element) ไม่มีสิ่งเทียบเท่า ใส่ CSS ลงใน HTML ที่คุณส่ง ไม่มีลำดับ “เขียน CSS ก่อนแล้วจึงเขียน body”
  • การแทนที่แบบต่อ AddPage. mPDF ยอมให้ AddPage() เปลี่ยน format/orientation กลางเอกสารด้วยอาร์กิวเมนต์ NextPDF addPage() ไม่รับอาร์กิวเมนต์เช่นนั้น การเปลี่ยนขนาดถูกกำหนดผ่านโมเดลเอกสาร ไม่ใช่ผ่านการเรียกหน้า
  • HTML ของ header/footer. mPDF ลงทะเบียน running headers เป็น HTML fragment แยกต่างหาก อย่าวางลงใน body จับคู่สิ่งเหล่านี้กับกลไก NextPDF header/footer
  • ชื่อฟอนต์. mPDF ทำให้ชื่อฟอนต์เป็นมาตรฐานผ่านตาราง fontdata/core-font ของตน NextPDF จับคู่ CSS font-family กับไดเรกทอรีฟอนต์ alias ของ mPDF ที่เคยเลือกได้อย่างเงียบๆ อาจต้องระบุ @font-face/family
  • อักขระปลายทาง. 'I'/'D'/'F'/'S' ไม่ได้รับการยอมรับ ให้ใช้ enum OutputDestination หรือ 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 programISO 32000-2§9
format/margins ของหน้าจับคู่กับ page boundary boxISO 32000-2§7
ข้อมูลเมตาของ Title / protection ลงเอยใน info dictionary / XMPISO 32000-2§14
การจับคู่ฟอนต์ / การสำรองฟอนต์ขึ้นอยู่กับเอนจินCSS Fonts 4§5.5

NextPDF สร้างเนื้อหาแบบ ISO 32000-2 แต่ไม่ได้ยืนยันความเหมือนกันเชิงภาพกับ mPDF ตรวจทานผลลัพธ์ใหม่ทุกครั้งที่คุณเปลี่ยน renderer

ไม่เกี่ยวข้อง NextPDF core ครอบคลุมเส้นทางการย้ายระบบจาก mPDF ที่อธิบายไว้ในหน้านี้


ทีมที่รัน 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

คีย์การตั้งค่าของ mPDF ด้านล่างได้รับการยืนยันกับ public repository ต้นทาง (mpdf/mpdf, development) ไม่มีการคัดลอกข้อความเอกสารต้นทางมาแสดง

คีย์การตั้งค่าของ mPDFNextPDFหมายเหตุ
mode(ไม่มีสิ่งเทียบเท่า)สตริง mode ของ mPDF ('utf-8', 'c', '+aCJK', …) เลือกพฤติกรรม font/script NextPDF เป็น Unicode เสมอ ข้อความ Chinese, Japanese และ Korean (CJK) จัดการด้วยการเลือกฟอนต์ ไม่ใช่ mode ให้ตัดคีย์นี้ออก
formatConfig->pageSize (PageSize อ็อบเจกต์ค่า (VO))รูปแบบที่มีชื่อจะกลายเป็นมิติเป็นจุดอย่างชัดเจน array [w,h] จับคู่กับ PageSize ได้
orientationสลับ PageSize width/heightไม่มี flag สำหรับ orientation แนวนอนหมายถึง width > height
default_font_sizefont-size ฐานของ CSSตั้งค่านี้ใน stylesheet ฐานของคุณ ไม่ใช่คีย์ของ constructor
default_fontCSS font-family / ฟอนต์ที่ลงทะเบียนตั้งค่าตระกูลฟอนต์เริ่มต้นผ่าน CSS / การลงทะเบียนฟอนต์
margin_left / margin_right / margin_top / margin_bottomConfig->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 ร่วมกับการจับคู่ CSS font-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 ถูกแทนที่ด้วย enum OutputDestination + save()/getPdfData()
  1. เพิ่ม nextpdf/core ควบคู่กับ mpdf/mpdf และคงการติดตั้ง mPDF ไว้ก่อน
  2. เลือกเอกสารที่มีความเสี่ยงต่ำหนึ่งฉบับ แปลง new Mpdf([...]) ผ่าน การจับคู่ config และแปลง WriteHTML/Output ผ่าน การจับคู่ verb
  3. ลงทะเบียนฟอนต์ที่เอกสารใช้ใน Config->fontsDirectory และเพิ่มการประกาศ @font-face/family อย่างชัดเจนสำหรับ alias ของ mPDF แต่ละรายการ
  4. สร้าง PDF ทั้งสองชุดสำหรับ input เดียวกันและเปรียบเทียบเชิงภาพ ความแตกต่าง (การแทนที่ฟอนต์ การตัดบรรทัด) เป็นสิ่งที่คาดหมายได้สำหรับเอนจินที่เป็นอิสระ ให้ยอมรับความแตกต่างนั้นเป็นรายเอกสาร
  5. จับคู่ HTML ของ header/footer ใดๆ กับกลไก NextPDF header/footer
  6. ทำซ้ำเป็นรายเอกสาร โดยเริ่มจากความเสี่ยงต่ำสุดก่อน คงการติดตั้ง mPDF ไว้จนกว่าจะถึง cutover ครั้งสุดท้าย
  7. นำ 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 / XMPsrc/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