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

คู่มือสำหรับนักพัฒนา Artisan

แพ็กเกจ Artisan มีหน้าที่สองอย่างที่เชื่อมโยงกัน คือเรนเดอร์ Hypertext Markup Language (HTML) ผ่าน Chrome และนำเข้าหน้า Portable Document Format (PDF) ที่ได้เข้าสู่เอกสาร NextPDF เมื่อแก้จุดบกพร่อง ให้แยกขอบเขตของ Chrome ตัวแยกวิเคราะห์ และตัวนำเข้าออกจากกัน

ใช้คู่มือนี้เมื่อเขียนการผสานรวมตัวเรนเดอร์ เวิร์กเกอร์ที่ทำงานยาวนาน การวินิจฉัยตัวแยกวิเคราะห์ หรือการทดสอบสำหรับ nextpdf/artisan

เลเยอร์ดูแลโดยความรับผิดชอบอย่าใส่ไว้ที่นี่
แอปพลิเคชันแอปพลิเคชันอนุญาตให้สร้าง HTML และเลือกการกำหนดค่าตัวเรนเดอร์การจัดการกระบวนการของเบราว์เซอร์
นโยบาย HTMLแอปพลิเคชันและแพ็กเกจปฏิเสธ HTML ที่ไม่ปลอดภัยหรือมีขนาดใหญ่เกินไปก่อนเรนเดอร์การให้สิทธิ์ผู้เช่าหรือการตัดสินใจทางธุรกิจ
ตัวเรนเดอร์ Chromenextpdf/artisanเรนเดอร์ HTML ให้เป็น PDF เดี่ยวที่ Chrome สร้างขึ้นการซ่อม PDF ทั่วไปหรือการแก้ไข PDF ตามอำเภอใจ
ตัวแยกวิเคราะห์/ตัวนำเข้าnextpdf/artisanแยกวิเคราะห์ PDF ที่เรนเดอร์แล้วและนำเข้าหนึ่งหน้าเป็น form XObjectการตรวจสอบความสอดคล้องของ PDF อย่างครบถ้วน
เอนจินหลักnextpdf/nextpdfวางอ็อบเจกต์ form ที่นำเข้าและเขียนเอกสารสุดท้ายวงจรชีวิตของ Chrome DevTools Protocol (CDP)
ขั้นตอนพฤติกรรมการดำเนินการของนักพัฒนา
การสร้างการกำหนดค่าChromeRendererConfig กำหนดไบนารี ค่าหมดเวลา Cascading Style Sheets (CSS) ขนาดอินพุต และพฤติกรรมแซนด์บ็อกซ์ใช้การกำหนดค่าเฉพาะสภาพแวดล้อมแทนการฮาร์ดโค้ดค่าที่คาดเดาจากขณะทำงาน
การสร้างตัวเรนเดอร์ChromeHtmlRenderer เป็นเจ้าของ BrowserPool หนึ่งตัวนำตัวเรนเดอร์มาใช้ซ้ำภายในเวิร์กเกอร์ จากนั้นปิดตัวเรนเดอร์ระหว่างการปิดระบบ
การตรวจสอบ HTMLนโยบายความปลอดภัยตรวจสอบขนาดและห่อหุ้มเอกสารด้วย CSS เริ่มต้นตรวจสอบการให้สิทธิ์ของผู้เรียกก่อนขั้นตอนนี้
การพิมพ์ของ ChromeCDP เรนเดอร์ PDF แบบเดี่ยวบล็อกทรัพยากรภายนอกไว้เสมอ เว้นแต่นโยบายที่ผ่านการตรวจสอบจะอนุญาตให้ใช้ได้
การแยกวิเคราะห์ PDFPdfReader::parse() อ่านข้อมูล xref หน้า อ็อบเจกต์ ทรัพยากร และการปรับปรุงแก้ไขถือว่าความล้มเหลวของตัวแยกวิเคราะห์เป็นความล้มเหลวของการเรนเดอร์ เว้นแต่มีเป้าหมายเพื่อวินิจฉัย
การนำเข้าหน้าPageImporter::import() ดึงเนื้อหาของหน้า media box ทรัพยากร และอ็อบเจกต์ที่ฝังไว้นำเข้าหน้า 0 เว้นแต่เวิร์กโฟลว์จะเลือกหน้าอื่นโดยเจตนา
เส้นทางวัตถุประสงค์
app/Pdf/Renderers/*ตัวห่อหุ้มระดับแอปพลิเคชันรอบ ChromeHtmlRenderer
app/Pdf/Templates/*การเรนเดอร์เทมเพลต HTML และการแมป data transfer object (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();
}
}

ใช้ส่วนต่อประสานโปรแกรมประยุกต์ (API) ของตัวแยกวิเคราะห์เมื่อเอาต์พุตของ Chrome นำเข้าไม่สำเร็จ ทำการวินิจฉัยแบบอ่านอย่างเดียว และหลีกเลี่ยงการเปลี่ยนสถานะของตัวแยกวิเคราะห์หลังจากนำเข้าสำเร็จแล้ว

คำถามในการวินิจฉัยAPI ที่จะใช้สัญญาณที่คาดหวัง
ไฟล์แยกวิเคราะห์ได้หรือไม่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 ที่มีขนาดใหญ่เกินไปและความพยายามใช้ทรัพยากรที่ถูกบล็อก
  • การทดสอบการนำเข้ายืนยันว่าอ็อบเจกต์ form ที่คืนค่ามามีเนื้อหา media box และทรัพยากร
  • การทดสอบตัวแยกวิเคราะห์ครอบคลุมตาราง cross-reference (xref) สตรีม xref สตรีมอ็อบเจกต์ และกรณีฟิกซ์เจอร์ที่ผิดรูปแบบ
  • การทดสอบเวิร์กเกอร์เรียก close() และยืนยันว่าไม่มีกระบวนการเบราว์เซอร์เหลืออยู่
  • การทดสอบประสิทธิภาพบันทึกเวลาการเรนเดอร์ตามเทมเพลตและขนาดเนื้อหา