تخطَّ إلى المحتوى

الترحيل من mPDF إلى NextPDF

يساعدك هذا الدليل على نقل قاعدة شفرة قائمة على ⁨mPDF⁩ إلى نواة ⁨NextPDF.⁩ في ⁨mPDF⁩، يكون استدعاء المحتوى الرئيسي هو WriteHTML()، وهو يُعيَّن مباشرةً على Document::writeHtml(). يتمثل معظم العمل في تعيين مصفوفة إعداد المُنشئ (إذ يُهيِّئ ⁨mPDF⁩ كل شيء عبر مصفوفة ترابطية واحدة تُمرَّر إلى new Mpdf([...])) وفي التعامل مع اختلاف معالجة الخطوط. ⁨NextPDF⁩ و⁨mPDF⁩ محركان مستقلان، لذلك يكون المستند المُرحَّل متوافقًا مع ناتج ⁨mPDF⁩، لا مطابقًا له بايتًا ببايت. يغطي هذا الدليل تعيين الأفعال، وتعيين مصفوفة الإعداد، واختلافات الخطوط، واختلافات دعم صفحات الأنماط المتتالية (⁨CSS⁩)، والفروق السلوكية، وتسلسلًا آمنًا للترحيل.

تُحدِّد مصفوفة دعم صفحات الأنماط المتتالية (⁨CSS⁩) ميزات لغة ترميز النص التشعبي (⁨HTML⁩) و⁨CSS⁩ التي جرى التحقق منها. يصف هذا الدليل السلوك، لكنه لا يؤكد التكافؤ المرئي مع ⁨mPDF.⁩

Terminal window
composer require nextpdf/core:^3

أبقِ mpdf/mpdf مُثبَّتًا أثناء الترحيل. أزِله بعد اكتمال التحويل النهائي (انظر تسلسل الترحيل الآمن).

يجمع كائن Mpdf الخاص بـ ⁨mPDF⁩ بين الإعداد وسلوك العرض ضمن واجهة واحدة. تُهيِّئه مصفوفة المُنشئ، ويُشغِّله WriteHTML() إضافةً إلى أفعال ترقيم الصفحات (AddPage، SetHTMLHeader، SetHTMLFooter). يفصل ⁨NextPDF⁩ الإعداد في كائن القيمة غير القابل للتغيير NextPDF\Core\Config ويكتب المحتوى عبر Document::writeHtml(). لا توجد سلسلة “وضع” في المُنشئ. يُحلِّل ⁨NextPDF⁩ ما تُمرِّره من ⁨HTML⁩، ثم يُصدِر المستند عبر save() أو output() أو getPdfData().

الخطوط: يأتي ⁨mPDF⁩ مع دليل خطوط، وخريطة fontdata، ومجموعة احتياطية من “الخطوط الأساسية”. يحلّ ⁨NextPDF⁩ الخطوط من دليل خطوط واحد إضافةً إلى مطابقة font-family في ⁨CSS⁩، ويُجزِّئ دائمًا الخطوط المضمَّنة (المنظمة الدولية للتوحيد القياسي (⁨ISO⁩) 32000-2 §9، iso32000_2_sec9#x1.x45.p7). مطابقة الخطوط والاحتياط منها خاصّان بكل محرك (⁨CSS Fonts 4⁩ §5.5، css_fonts_4#x1.x5.x5.x1.p13)، لذلك قد يختلف استبدال المحارف. هذا هو الاختلاف المرئي الأبرز، ويُغطَّى في اختلاف معالجة الخطوط.

سطح واجهة برمجة التطبيقات (⁨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، وكائن القيمة NextPDF\Core\Config.

تعيين أفعال واجهة برمجة التطبيقات (⁨API⁩)

قسم بعنوان «تعيين أفعال واجهة برمجة التطبيقات (⁨API⁩)»

أسماء طرائق ⁨mPDF⁩ العامة أدناه مؤكَّدة مقابل المستودع العام المنبع (mpdf/mpdf، development)؛ راجِع ملف مصدر الإسناد داخل المستودع _source-sidecar-upstream-api.md. لا يُعاد إنتاج أي نص توثيق منبع.

⁨mPDF⁩⁨NextPDF⁩ملاحظات
new Mpdf([...])Document::createStandalone($config)تُعيَّن مصفوفة إعداد ⁨mPDF⁩ على NextPDF\Core\Config؛ انظر تعيين الإعداد. استخدم DocumentFactory للعمليات طويلة العمر.
$mpdf->WriteHTML($html)$doc->writeHtml($html)تعيين مباشر. وسيط ⁨mPDF⁩ الثاني $mode (مستند كامل مقابل ⁨CSS⁩ فقط مقابل عنصر) ليس له نظير في ⁨NextPDF⁩؛ مرِّر ⁨HTML⁩ كاملًا.
$mpdf->WriteFixedPosHTML(...)$doc->writeHtmlCell(...)منطقة ⁨HTML⁩ محدَّدة الموضع والحجم؛ عيِّن وسائط ⁨x/y/width/height.⁩
$mpdf->AddPage(...)$doc->addPage()لا يأخذ ⁨NextPDF⁩ تجاوزات ⁨mPDF⁩ لكل استدعاء والخاصة بالـ ⁨orientation/format/⁩الهوامش كوسائط؛ وبدلًا من ذلك غيِّر نموذج المستند بين الاستدعاءات.
$mpdf->SetHTMLHeader($html) / SetHTMLFooter($html)⁨header/footer⁩ عبر واجهة برمجة تطبيقات التخطيط (⁨Layout API⁩)تُعيَّن رؤوس ⁨HTML⁩ الجارية في ⁨mPDF⁩ على آلية ⁨header/footer⁩ في ⁨NextPDF⁩، وليس على ⁨HTML⁩ مضمَّن في أعلى المتن.
$mpdf->Output($name, $dest)$doc->output($name, OutputDestination::…)تُعيَّن محارف الوجهة في ⁨mPDF⁩ (I/D/F/S) على تعداد 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)تستقر في قاموس المعلومات في ⁨ISO 32000-2⁩ §14 / منصة البيانات الوصفية القابلة للتوسيع (⁨XMP⁩) (iso32000_2_sec14#x1.x5.p5).
$mpdf->SetProtection($perms,...)$doc->setEncryption(...) (واجهة برمجة تطبيقات الأمان)الأذونات تعاونية مع القارئ، وليست تحكمًا في الوصول — انظر ملاحظات الأمان.
<?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، وهو الأساس القابل للتشغيل لمفاهيم معالجة الخطوط في هذا الدليل. يستخدم حجم صفحة صريحًا وهوامش ومتن محتوى يختبر انتقاء الخطوط.

<?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 = عنصر). ضع ⁨CSS⁩ ضمن ما تُمرِّره من ⁨HTML⁩؛ لا يوجد تسلسل “اكتب ⁨CSS⁩ ثم اكتب المتن”.
  • تجاوزات لكل AddPage. يسمح ⁨mPDF⁩ لـ AddPage() بتغيير الـ ⁨format/orientation⁩ في منتصف المستند عبر وسائط. لا يأخذ addPage() في ⁨NextPDF⁩ مثل هذه الوسائط؛ تتغير أحجام النموذج على مستوى المستند، لا عبر استدعاء الصفحة.
  • رؤوس/تذييلات ⁨HTML.⁩ يُسجِّل ⁨mPDF⁩ الرؤوس الجارية كأجزاء ⁨HTML⁩ منفصلة؛ لا تلصقها في المتن. عيِّنها على آلية ⁨header/footer⁩ في ⁨NextPDF.⁩
  • أسماء الخطوط. يُسوِّي ⁨mPDF⁩ أسماء الخطوط عبر جدول fontdata/⁨core-font⁩ الخاص به. يطابق ⁨NextPDF⁩ الـ font-family في ⁨CSS⁩ مقابل دليل الخطوط؛ وقد يحتاج اسم ⁨mPDF⁩ المستعار الذي كان يُحلّ ضمنيًا إلى @font-face/⁨family.⁩ صريحين.
  • محارف الوجهة. الـ 'I'/'D'/'F'/'S' غير مقبولة؛ استخدم تعداد OutputDestination أو save()/getPdfData().

الدالة writeHtml() تعمل بتمريرة واحدة (⁨ADR-001⁩)؛ وتتبع ذروة الذاكرة حجم المستند، لا نموذج كائن مستند (⁨DOM⁩) محتفظًا به. ميزانية مثال هذا الدليل: wall_ms: 2000, peak_mb: 128. للمستندات الطويلة، قسِّم المحتوى عبر استدعاءات addPage() بدلًا من تمرير سلسلة ضخمة واحدة. هذا هو الإرشاد نفسه المنطبق على تقطيع $mode في ⁨mPDF⁩، لكن بصياغة تناسب نموذج الصفحة.

  • الأذونات تعاونية مع القارئ. يوفر SetProtection()setEncryption() السرية، لا التحكم في الوصول: تعتمد بِتات الأذونات في ⁨ISO⁩ على قارئ متعاون. لا تعرض التشفير للمستخدمين على أنه تحكم في الوصول.
  • البيانات الوصفية. تستقر SetTitle() ومعلومات المستند في قاموس المعلومات في ⁨ISO 32000-2⁩ §14 / ⁨XMP⁩ (iso32000_2_sec14#x1.x5.p5)؛ لا تُخزِّن أسرارًا هناك أبدًا.
  • لا يُنفِّذ ⁨NextPDF⁩ النصوص البرمجية داخل المستند؛ ولا يُغيِّر أي توجيه ⁨mPDF⁩ ذلك هنا.
العبارةالمواصفةالبند⁨reference_id⁩
تُكتب الخطوط كبرامج خطوط ⁨embedded/subset.⁩⁨ISO 32000-2⁩§9
تُعيَّن ⁨format/margins⁩ الصفحة على مربع حدود الصفحة.⁨ISO 32000-2⁩§7
تستقر البيانات الوصفية للعنوان/الحماية في قاموس المعلومات / ⁨XMP.⁩⁨ISO 32000-2⁩§14
مطابقة الخطوط / الاحتياط منها خاصّة بكل محرك.⁨CSS Fonts 4⁩§5.5

يُنتج ⁨NextPDF⁩ محتوى ⁨ISO 32000-2⁩؛ لكنه لا يؤكد التطابق المرئي مع ⁨mPDF.⁩ راجِع الناتج كلما غيَّرت المُصيِّر.

لا ينطبق. تُغطِّي نواة ⁨NextPDF⁩ مسار ترحيل ⁨mPDF⁩ الموصوف هنا.


تفاصيل الترحيل (أقسام ⁨R6⁩ المطلوبة)

قسم بعنوان «تفاصيل الترحيل (أقسام ⁨R6⁩ المطلوبة)»

هذا الدليل موجَّه إلى الفِرق التي تُشغِّل mpdf/mpdf لتحويل ⁨HTML⁩ إلى ⁨PDF⁩ من جانب الخادم. إذا كانت شفرتك مبنية حول new Mpdf([...]) + WriteHTML + Output (+ ⁨header/footer⁩ اختياري)، فإن تعيين الأفعال وتعيين الإعداد يغطيانها.

ضمن النطاق: مصفوفة إعداد مُنشئ Mpdf، وWriteHTML/Output/AddPage، و⁨headers/footers⁩، والخطوط، والحماية، والبيانات الوصفية. خارج النطاق: أصناف ⁨mPDF⁩ الداخلية وسطح مساعِدات الاستجابة السريعة (⁨QR⁩)/⁨barcode/watermark.⁩ عيِّن هذه الأجزاء على وحدات ⁨NextPDF⁩ المقابلة — ⁨Barcode⁩ و⁨Graphics⁩ — التي لا تُغطَّى هنا.

التوافق سلوكي، ولا توجد طبقة توافق جاهزة: لا يوفر ⁨NextPDF⁩ طبقة توافق لصنف Mpdf. أعِد كتابة كل موضع استدعاء. استخدم الصفوف التي جرى التحقق منها في مصفوفة دعم ⁨CSS⁩ لتحديد توقعات ميزات ⁨CSS.⁩

تعيين مصفوفة إعداد المُنشئ

قسم بعنوان «تعيين مصفوفة إعداد المُنشئ»

مفاتيح إعداد ⁨mPDF⁩ أدناه مؤكَّدة مقابل المستودع العام المنبع (mpdf/mpdf، development). لا يُعاد إنتاج أي نص من توثيق المنبع.

مفتاح إعداد ⁨mPDF⁩⁨NextPDF⁩ملاحظات
mode(لا نظير)تختار سلسلة وضع ⁨mPDF⁩ ('utf-8'، 'c'، '+aCJK'، …) سلوك الـ ⁨font/script. NextPDF⁩ يعمل دائمًا بـ ⁨Unicode⁩؛ ويُعالَج نص الصينية واليابانية والكورية (⁨CJK⁩) بانتقاء الخطوط، لا بوضع. أسقِط المفتاح.
formatConfig->pageSize (كائن القيمة PageSize ‏(⁨VO⁩))تصبح الصيغ المسمّاة أبعادًا نقطية صريحة؛ وتُعيَّن المصفوفات [w,h] على PageSize.
orientationبدِّل ⁨width/height⁩ في PageSizeلا توجد راية اتجاه؛ يعني الوضع الأفقي أن العرض > الارتفاع.
default_font_sizeحجم خط ⁨CSS⁩ الأساسيعيِّن هذا في صفحة الأنماط الأساسية لديك، لا في مفتاح مُنشئ.
default_fontfont-family في ⁨CSS⁩ / خط مُسجَّلعيِّن العائلة الافتراضية عبر ⁨CSS⁩ / تسجيل الخطوط.
margin_left / margin_right / margin_top / margin_bottomConfig->margins (‏Margin ⁨VO⁩) بالنقاطاستخدم كائن قيمة Margin واحدًا؛ ترتيب مُنشئه هو Margin(top, right, bottom, left) (تحقَّق مقابل src/ValueObjects/Margin.php)، لا ترتيب مفاتيح ⁨mPDF.⁩
margin_header / margin_footerإزاحة ⁨header/footer⁩ عبر واجهة برمجة تطبيقات التخطيط (⁨Layout API⁩)عيِّن هذه على إعداد ⁨header/footer⁩ في ⁨NextPDF⁩، لا على مفاتيح المُنشئ.
  • دليل خطوط واحد. تتحول قائمة أدلة خطوط ⁨mPDF⁩ وخريطة fontdata والاحتياط بالخطوط الأساسية إلى Config->fontsDirectory إضافةً إلى مطابقة font-family في ⁨CSS.⁩
  • التجزئة دائمًا. يُجزِّئ ⁨NextPDF⁩ دائمًا الخطوط المضمَّنة (⁨ISO 32000-2⁩ §9، iso32000_2_sec9#x1.x45.p7)؛ ولا نظير لرايات التجزئة في ⁨mPDF⁩، وهي غير لازمة.
  • المطابقة خاصة بكل محرك. تختلف مطابقة الخطوط والاحتياط منها بحسب المحرك (⁨CSS Fonts 4⁩ §5.5، css_fonts_4#x1.x5.x5.x1.p13)؛ وقد يحتاج اسم خط ⁨mPDF⁩ المستعار إلى @font-face صريح أو اسم عائلة دقيق. أعِد ضبط أساس عرض المحارف بعد الترحيل. اختلافات الاستبدال متوقَّعة، وليست عيوبًا.
  • استبدال الخطوط (انظر أعلاه) — الاختلاف الرئيسي المرئي.
  • لا $mode على WriteHTML — مرِّر ⁨HTML⁩ كاملًا مع ⁨CSS⁩ مضمَّن.
  • لا تجاوز للصيغة لكل AddPage — تتغير أحجام النموذج على مستوى المستند.
  • الأذونات تعاونية مع القارئ (انظر ملاحظات الأمان).
  • محرك تخطيط مستقل — قد يختلف التفاف الأسطر / ترقيم الصفحات في المحتوى الكثيف؛ أعِد ضبط أساس الفروق المرئية.

هذه فروق سلوكية موثَّقة، وليست عيوبًا في أي من المحركين.

  • سلسلة مُنشئ mode — غير مُنمذَجة (دائمًا ⁨Unicode⁩).
  • وسائط الـ ⁨format/orientation/⁩الهامش لكل AddPage() — ليست وسائط في ⁨NextPDF.⁩
  • خريطة fontdata في ⁨mPDF⁩ — يحلّ محلها دليل الخطوط + مطابقة ⁨CSS.⁩
  • محارف الوجهة 'I'/'D'/'F'/'S' في ⁨mPDF⁩ — يحلّ محلها تعداد OutputDestination + save()/getPdfData().
  1. أضِف nextpdf/core إلى جانب mpdf/mpdf؛ أبقِ ⁨mPDF⁩ مُثبَّتًا في الوقت الحالي.
  2. اختر مستندًا واحدًا منخفض المخاطر. حوِّل new Mpdf([...]) عبر تعيين الإعداد وWriteHTML/Output عبر تعيين الأفعال.
  3. سجِّل الخطوط التي يستخدمها المستند في Config->fontsDirectory، وأضِف تصريحات @font-face/⁨family⁩ صريحة لأي اسم ⁨mPDF⁩ مستعار.
  4. وَلِّد ملفي ⁨PDF⁩ كليهما للمدخل نفسه وقارِنهما مرئيًا. الفروق (استبدال الخطوط، التفاف الأسطر) متوقَّعة في المحركات المستقلة — اقبلها لكل مستند.
  5. عيِّن أي ⁨header/footer⁩ بصيغة ⁨HTML⁩ على آلية ⁨header/footer⁩ في ⁨NextPDF.⁩
  6. كرِّر لكل مستند، الأقل خطورة أولًا؛ أبقِ ⁨mPDF⁩ مُثبَّتًا حتى التحويل الأخير.
  7. أزِل mpdf/mpdf من composer.json بعد التحويل النهائي.
  • خُذ لقطة من ناتج ⁨mPDF⁩ للمستندات الممثِّلة قبل تغيير الشفرة (مدخلات ذهبية؛ ستختلف البايتات).
  • لكل مستند مُرحَّل، أكِّد القبول بفحصك الخاص (مقارنة مرئية
    • واستخراج النص). يمارس examples/04-text-and-fonts.php وexamples/08-html-basic.php سلوك الخطوط/⁨HTML⁩ في ⁨NextPDF⁩، إضافةً إلى مجموعتي ⁨Html/Font⁩ في tests/ الأساسية. قبول الترحيل خاصّ بكل مستند ويبقى مسؤوليتك.
  • أضِف اختبار انحدار لكل مستند مُرحَّل.

كل عبارة سلوكية عن ⁨NextPDF⁩ في هذه الصفحة مدعومة باختبار أو مثال أو توقيع مصدر أو سجل قرار معماري (⁨ADR⁩) داخل المستودع، أو — لخصائص صيغة ⁨PDF⁩ — ببنود ⁨ISO 32000-2⁩ / ⁨CSS⁩ المثبَّتة عبر التوليد المعزَّز بالاسترجاع (⁨RAG⁩) في citations: في المقدمة الأمامية وجدول المطابقة. يُؤكَّد سلوك ⁨mPDF⁩ فقط على أنه “محرك مستقل — توقَّع فروقًا موثَّقة”؛ ولا تدّعي هذه الصفحة أي تكافؤ لا يُثبِته أثر داخل المستودع.

ادعاء سلوكي عن ⁨NextPDF⁩الدليل داخل المستودع (المسار)
تُعيَّن 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 هو (top, right, bottom, left).src/ValueObjects/Margin.php (ترتيب الخصائص المُرقّاة).
وجهة الإخراج هي تعداد NextPDF\Contracts\OutputDestination؛ 'I'/'D'/'F'/'S' غير مقبولة.src/Contracts/OutputDestination.php (الحالات Inline/Download/File/Stringtests/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:).
تُعيَّن SetTitle()setTitle()؛ تستقر البيانات الوصفية في قاموس المعلومات / ⁨XMP.⁩src/Core/Concerns/HasMetadata.php (‏setTitle()tests/Unit/Core/Concerns/DocumentInfoMetadataSetterBaselineTest.php؛ ⁨ISO 32000-2⁩ §14 (المقدمة الأمامية citations:).
تُضمَّن الخطوط دائمًا كبرامج مُجزَّأة.tests/Unit/Core/Concerns/DocumentTextOutputFontSubsettingAndBorderEdgeCaseTest.php؛ examples/04-text-and-fonts.php؛ ⁨ISO 32000-2⁩ §9 (المقدمة الأمامية citations:).
مطابقة الخطوط / الاحتياط منها خاصّة بكل محرك (اختلاف الاستبدال).⁨CSS Fonts 4⁩ §5.5 (المقدمة الأمامية citations: + المطابقة).
الدالة writeHtml() تمريرة واحدة؛ تتبع ذروة الذاكرة حجم المستند.docs/architecture/adr/ADR-001-stream-based-rendering-pipeline.md.

تبقى الحزمتان كلتاهما مُثبَّتتين حتى التحويل النهائي، لذا يعني التراجع لكل موضع استدعاء إرجاع ذلك الموضع إلى مسار ⁨mPDF.⁩ بعد التحويل النهائي، يعني التراجع استعادة mpdf/mpdf والشفرة السابقة من نظام التحكم في الإصدارات. لا يتضمن الأمر أي ترحيل للبيانات.

انظر الأداء. يُزيل نموذج التمريرة الواحدة تكلفة المخزن المؤقت المحتفظ به في ⁨mPDF.⁩ التكلفة الجديدة لكل مستند هي حلّ الخطوط في وقت التشغيل (الخطوة 3)، وهو قابل للتخزين المؤقت عبر دليل الخطوط.

  • الإبقاء على مفتاح mode وتوقُّع سلوك ⁨CJK⁩ منه؛ يُسقطه ⁨NextPDF⁩، ويُعالَج ⁨CJK⁩ بانتقاء الخطوط.
  • تمرير WriteHTML($html, 2) (وضع ⁨CSS⁩ فقط)؛ ضمِّن ⁨CSS⁩ بدلًا من ذلك.
  • لصق ⁨header/footer⁩ بصيغة ⁨HTML⁩ في المتن.
  • توقُّع أن يُحلّ اسم ⁨mPDF⁩ مستعار إلى الخط نفسه دون عائلة صريحة.
  • توقُّع ناتج ⁨byte/pixel-identical⁩ (محركان مستقلان — لا يدّعي هذا الدليل أبدًا توافقًا جاهزًا أو توافقًا بنسبة 100%).
  • معاملة مصفوفة دعم ⁨CSS⁩ على أنها استشارية؛ فهي مرجع الميزات التي جرى التحقق منها.