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

คู่มือสำหรับนักพัฒนา 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() และยืนยันว่าไม่มีกระบวนการเบราว์เซอร์เหลืออยู่
  • การทดสอบประสิทธิภาพบันทึกเวลาการเรนเดอร์ตามเทมเพลตและขนาดเนื้อหา