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

دليل المطوّر لحزمة Artisan

تتولّى حزمة ⁨Artisan⁩ مسؤوليتين مترابطتين: تصيير لغة ترميز النص الفائق (⁨HTML⁩) عبر ⁨Chrome⁩، واستيراد صفحة صيغة المستند المحمول (⁨PDF⁩) الناتجة إلى مستند ⁨NextPDF.⁩ عند تنقيح المشكلات، افصل بوضوح بين حدود ⁨Chrome⁩ والمُحلِّل والمُستورِد.

استخدم هذا الدليل عند كتابة تكاملات المُصيِّر، أو العمليات المُعالِجة طويلة العمر، أو تشخيصات المُحلِّل، أو الاختبارات الخاصة بـ nextpdf/artisan.

الطبقةمملوكة لـالمسؤوليةلا تضع هنا
التطبيقالتطبيقتفويض إنشاء ⁨HTML⁩ واختيار إعدادات المُصيِّر.إدارة عملية المتصفح.
سياسة ⁨HTML⁩التطبيق والحزمةرفض ⁨HTML⁩ غير الآمن أو الزائد في الحجم قبل التصيير.تفويض المستأجر أو القرارات التجارية.
مُصيِّر ⁨Chrome⁩nextpdf/artisanتصيير ⁨HTML⁩ إلى ملف ⁨PDF⁩ مستقل يُنتجه ⁨Chrome.⁩إصلاح ⁨PDF⁩ عمومًا أو تحرير ⁨PDF⁩ على نحو تعسّفي.
المُحلِّل/المُستورِدnextpdf/artisanتحليل ملف ⁨PDF⁩ المُصيَّر واستيراد صفحة واحدة بوصفها كائن نموذج ⁨XObject.⁩التحقّق الكامل من مطابقة ⁨PDF.⁩
المحرّك الأساسيnextpdf/nextpdfوضع كائنات النموذج المُستورَدة وكتابة المستند النهائي.إدارة دورة حياة بروتوكول أدوات مطوّري ⁨Chrome⁩ (⁨CDP⁩).
المرحلةالسلوكإجراء المطوّر
إنشاء الإعداداتيعرّف ChromeRendererConfig الملف الثنائي والمهلة وأوراق الأنماط المتراصّة (⁨CSS⁩) وحجم الإدخال وسلوك الصندوق الرملي.استخدم إعدادات خاصة بالبيئة بدلاً من تخمينات وقت التشغيل المُثبَّتة في الشيفرة.
إنشاء المُصيِّريمتلك ChromeHtmlRenderer كائن BrowserPool.أعد استخدام المُصيِّر داخل العملية المُعالِجة، ثم أغلقه أثناء إيقاف التشغيل.
التحقّق من ⁨HTML⁩تتحقّق سياسة الأمان من الحجم وتُحيط المستند بأوراق أنماط ⁨CSS⁩ الافتراضية.تحقّق من تفويض المُستدعي قبل هذه المرحلة.
طباعة ⁨Chrome⁩يُصيِّر ⁨CDP⁩ ملف ⁨PDF⁩ مستقلاً.أبقِ الموارد الخارجية محظورة ما لم تسمح بها سياسة خضعت للمراجعة.
تحليل ⁨PDF⁩يقرأ PdfReader::parse() بيانات المرجع التبادلي ⁨xref⁩ والصفحات والكائنات والموارد والمراجعات.عامِل إخفاقات المُحلِّل مثل إخفاقات التصيير ما لم تكن التشخيصات هي الهدف.
استيراد الصفحةPageImporter::import() يستخرج محتوى الصفحة وصندوق الوسائط والموارد والكائنات المُضمَّنة.استورِد الصفحة 0 ما لم يختر سير العمل صفحة أخرى عن قصد.
المسارالغرض
app/Pdf/Renderers/*غلاف التطبيق حول ChromeHtmlRenderer.
app/Pdf/Templates/*تصيير قوالب ⁨HTML⁩ وتعيين كائن نقل البيانات (⁨DTO⁩) إلى العرض.
app/Pdf/Policies/*سياسة تصيير حجم ⁨HTML⁩ والموارد والمستأجر.
tests/Pdf/Renderer/*اختبارات دخان للمُصيِّر باستخدام عيّنات ⁨HTML⁩ صغيرة.
tests/Pdf/Parser/*عيّنات المُحلِّل لمُخرَجات ⁨Chrome⁩ المُستورَدة.

افصل تصيير القوالب عن تصيير المتصفح. مرّر إلى المُصيِّر ملف ⁨HTML⁩ النهائي وعرض صفحة معروفًا.

<?php
use NextPDF\Artisan\ChromeHtmlRenderer;
use NextPDF\Artisan\ChromeRendererConfig;
use NextPDF\Artisan\PageImporter;
use NextPDF\Parser\PdfReader;
$renderer = new ChromeHtmlRenderer(new ChromeRendererConfig(
renderTimeout: 30,
maxHtmlSize: 1_000_000,
));
$result = $renderer->render($html, widthPt: 595.28);
$reader = new PdfReader($result->getPdfData());
$reader->parse();
$form = (new PageImporter())->import($reader);

أنشئ مُصيِّرًا واحدًا لكل عملية مُعالِجة أو لكل نطاق طلب. أعد استخدامه لتجنّب تكلفة بدء تشغيل ⁨Chrome⁩ المتكرّرة. أغلقه صراحةً لمنع تسرّب العمليات عند إيقاف تشغيل العملية المُعالِجة.

<?php
final class InvoiceChromeRenderer
{
public function __construct(
private readonly ChromeHtmlRenderer $renderer,
) {}
public function renderInvoice(string $html): string
{
return $this->renderer
->render($html, widthPt: 595.28)
->getPdfData();
}
public function close(): void
{
$this->renderer->close();
}
}

استخدم واجهات برمجة التطبيقات (⁨APIs⁩) الخاصة بالمُحلِّل عند إخفاق استيراد مُخرَجات ⁨Chrome.⁩ أبقِ التشخيصات للقراءة فقط، وتجنّب تغيير حالة المُحلِّل بعد أي استيراد ناجح.

سؤال التشخيصالواجهة البرمجية المستخدَمةالإشارة المتوقّعة
هل يمكن تحليل الملف؟PdfReader::parse()يطلق استثناءً عند وجود بنية ⁨PDF⁩ غير صالحة.
هل توجد الصفحة 0؟PdfReader::getPage(0)يُعيد كائن PdfObject.
هل يوجد محتوى؟PdfReader::getPageContentStream($page)دفق محتوى غير فارغ.
هل الموارد موجودة؟PdfReader::getPageResources($page)مصفوفة قاموس الموارد.
هل توجد مراجعات تزايدية؟PdfReader::getRevisionCount()عدد أكبر من واحد.
أيُّ كائن أخفق؟PdfTokenizer::getOffset() وسياق استثناء المُحلِّل.إزاحة بايت تساعد على تقليل العيّنة.
نقطة التوسعةاستخدمها لـالقيد
ChromeRendererConfig::fromArray()تعيين إعدادات إطار العمل.تعود القيم الاختيارية غير المعروفة أو ذات النوع الخاطئ إلى القيم الافتراضية.
HtmlSecurityPolicyInterfaceسياسة ⁨HTML⁩ على طبقة التحليل.لا يحلّ محل ضوابط النقل أو العمليات أو التفويض.
LoggerInterfaceتشخيصات التصيير والمتصفح.لا تُسجِّل محتوى ⁨HTML⁩ افتراضيًا.
BrowserPoolإعادة استخدام عملية ⁨Chrome⁩ طويلة العمر.يجب إغلاقه عند إيقاف تشغيل العملية المُعالِجة.
PageImporterتضمين صفحة خارجية محلَّلة.يجب تحليل القارئ أولاً.
فئات المُحلِّلالتشخيصات ومُخرَجات ⁨Chrome⁩ المُستورَدة.ليست مجموعة أدوات عامة لإصلاح ⁨PDF.⁩
  1. أعد إنتاج مقتطف ⁨HTML⁩ في اختبار تصيير مُصغَّر.
  2. تحقّق من maxHtmlSize وأوراق أنماط ⁨CSS⁩ الافتراضية ومسار ملف ⁨Chrome⁩ الثنائي.
  3. صيِّر بعرض ثابت بالنقاط.
  4. حلِّل بايتات ⁨PDF⁩ المُعادة باستخدام PdfReader::parse().
  5. استورِد الصفحة 0 ما لم يختر سير العمل صفحة أخرى عن قصد.
  6. أضف اختبارات عيّنات لأصغر ⁨HTML⁩ يعيد إنتاج كل إخفاق.
  7. أغلق المُصيِّر في خطّافات إيقاف تشغيل العملية المُعالِجة.
الإخفاقأين ينبغي معالجتهالاستجابة المُوصى بها
ملف ⁨Chrome⁩ الثنائي مفقودفحص النشر ومسار إنشاء المُصيِّر.أفشِل فحص الجاهزية قبل قبول حركة التصيير.
⁨HTML⁩ مفرط الحجمسياسة ⁨HTML.⁩ارفضه قبل بدء تشغيل ⁨Chrome.⁩
مهلة المتصفححدّ المُصيِّر.أفشِل التصيير، وسجِّل اسم القالب والحجم والعرض والمهلة.
إخفاق المُحلِّلحدّ الاستيراد.خزِّن عيّنة صغيرة مُطهَّرة للتنقيح عندما تسمح السياسة بذلك.
تسرّب عملية المتصفحدورة حياة العملية المُعالِجة.أغلق عند إيقاف التشغيل، وأعد التشغيل بعد أعداد تصيير مضبوطة.
الاهتمامالافتراضيمتى يُتجاوَز
مهلة التصيير30 ثانية.زِدها للمستندات ذات القياس المعروف والمحدودة فقط.
الحد الأقصى لحجم ⁨HTML⁩5,000,000 بايت.اخفِضها لنقاط النهاية العامة.
الصندوق الرمليمُفعَّل.عطِّله فقط عندما تتطلّب قيود الحاوية ذلك، ويكون المضيف معزولاً.
الارتفاعتلقائي عندما heightPt <= 0.استخدم ارتفاعًا ثابتًا لعقود التخطيط الصارمة.
الموارد الخارجيةمحظورة بموجب سياسة المُصيِّر.اسمح بها فقط عبر سياسة موارد خضعت للمراجعة.
  • اختبارات التصيير تغطّي ⁨HTML⁩ و⁨CSS⁩ تمثيليين.
  • اختبارات الأمان تغطّي ⁨HTML⁩ مفرط الحجم ومحاولات الوصول إلى الموارد المحظورة.
  • اختبارات الاستيراد تؤكّد أن كائن النموذج المُعاد يحتوي على محتوى وصندوق وسائط وموارد.
  • اختبارات المُحلِّل تغطّي جدول المرجع التبادلي (⁨xref⁩) ودفق ⁨xref⁩ ودفق الكائنات وحالات العيّنات المُشوَّهة.
  • اختبارات العملية المُعالِجة تستدعي close() وتتحقّق من عدم بقاء أي عملية متصفح.
  • اختبارات الأداء تسجّل زمن التصيير حسب القالب وحجم المحتوى.