Ga naar inhoud

Ontwikkelaarsgids voor Artisan

Het Artisan-pakket heeft twee nauw gekoppelde verantwoordelijkheden: Hypertext Markup Language (HTML) renderen via Chrome en de resulterende Portable Document Format (PDF)-pagina importeren in een NextPDF-document. Houd bij het opsporen van problemen de grenzen tussen Chrome, parser en importer duidelijk gescheiden.

Gebruik deze gids wanneer u renderer-integraties, langlopende workers, parserdiagnostiek of tests voor nextpdf/artisan schrijft.

LaagEigenaarVerantwoordelijkheidPlaats hier niet
ApplicatieApplicatieAutoriseer het genereren van HTML en kies de rendererconfiguratie.Beheer van browserprocessen.
HTML-beleidApplicatie en pakketWeiger onveilige of te grote HTML voordat u rendert.Tenant-autorisatie of zakelijke beslissingen.
Chrome-renderernextpdf/artisanRender HTML naar een zelfstandig PDF-bestand dat Chrome heeft geproduceerd.Algemene PDF-reparatie of willekeurige PDF-bewerking.
Parser/importernextpdf/artisanParseer het gerenderde PDF-bestand en importeer één pagina als form-XObject.Volledige PDF-conformiteitsvalidatie.
Core-enginenextpdf/nextpdfPlaats geïmporteerde form-objecten en schrijf het uiteindelijke document.Levenscyclus van het Chrome DevTools Protocol (CDP).
FaseGedragOntwikkelaarsactie
Configuratie aanmakenChromeRendererConfig definieert de binary, de time-out, de Cascading Style Sheets (CSS), de invoergrootte en het sandboxgedrag.Gebruik omgevingsspecifieke configuratie in plaats van hardgecodeerde aannames over de uitvoeringsomgeving.
Renderer aanmakenChromeHtmlRenderer beheert een BrowserPool.Hergebruik de renderer binnen een worker en sluit deze af wanneer de worker stopt.
HTML-validatieHet beveiligingsbeleid controleert de grootte en voorziet het document van standaard-CSS.Valideer de autorisatie van de aanroeper vóór deze fase.
Chrome printCDP rendert een zelfstandig PDF-bestand.Houd externe resources geblokkeerd, tenzij een beoordeeld beleid deze toestaat.
PDF-parsePdfReader::parse() leest xref-gegevens, pagina’s, objecten, resources en revisies.Behandel parserfouten als renderfouten, tenzij diagnostiek het doel is.
Pagina-importPageImporter::import() extraheert de pagina-inhoud, media box, resources en ingebedde objecten.Importeer pagina 0, tenzij de workflow bewust een andere pagina kiest.
PadDoel
app/Pdf/Renderers/*Applicatiewrapper rond ChromeHtmlRenderer.
app/Pdf/Templates/*HTML-templaterendering en de mapping van data transfer object (DTO) naar view.
app/Pdf/Policies/*Beleid voor HTML-grootte, resources en tenant-rendering.
tests/Pdf/Renderer/*Smoke-tests voor de renderer met kleine HTML-fixtures.
tests/Pdf/Parser/*Parserfixtures voor geïmporteerde Chrome-uitvoer.

Houd templaterendering gescheiden van browserrendering. Geef de renderer de definitieve HTML en een bekende paginabreedte mee.

<?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);

Maak één renderer per workerproces of per request-scope aan. Hergebruik deze om herhaalde opstartkosten van Chrome te vermijden. Sluit de renderer expliciet af om proceslekken tijdens het afsluiten van de worker te voorkomen.

<?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();
}
}

Gebruik de application programming interfaces (API’s) van de parser wanneer Chrome-uitvoer niet kan worden geïmporteerd. Zorg dat diagnostiek alleen-lezen blijft en wijzig de parserstatus niet na een geslaagde import.

Diagnostische vraagTe gebruiken APIVerwacht signaal
Laat het bestand zich parseren?PdfReader::parse()Werpt een uitzondering bij een ongeldige PDF-structuur.
Bestaat pagina 0?PdfReader::getPage(0)Retourneert een PdfObject.
Is er inhoud?PdfReader::getPageContentStream($page)Niet-lege content-stream.
Zijn er resources aanwezig?PdfReader::getPageResources($page)Array met de resource-dictionary.
Zijn er incrementele revisies?PdfReader::getRevisionCount()Aantal groter dan één.
Welk object is mislukt?PdfTokenizer::getOffset() en de contextinformatie van de parseruitzondering.Byte-offset om fixtures te verkleinen.
UitbreidingspuntGebruik het voorBeperking
ChromeRendererConfig::fromArray()Mapping van de frameworkconfiguratie.Onbekende of verkeerd getypeerde optionele waarden vallen terug op de standaardwaarden.
HtmlSecurityPolicyInterfaceHTML-beleid op parseerniveau.Vervangt geen transport-, proces- of autorisatiecontroles.
LoggerInterfaceRender- en browserdiagnostiek.Log HTML-inhoud standaard niet.
BrowserPoolHergebruik van langlevende Chrome-processen.Moet bij het afsluiten van de worker worden gesloten.
PageImporterHet inbedden van een geparseerde externe pagina.De reader moet eerst worden geparseerd.
ParserklassenDiagnostiek en geïmporteerde Chrome-uitvoer.Geen algemene PDF-reparatietoolkit.
  1. Reproduceer het HTML-fragment in een minimale rendertest.
  2. Valideer maxHtmlSize, de standaard-CSS en het pad naar de Chrome-binary.
  3. Render met een vaste breedte in punten.
  4. Parseer de geretourneerde PDF-bytes met PdfReader::parse().
  5. Importeer pagina 0, tenzij de workflow bewust een andere pagina kiest.
  6. Voeg fixturetests toe voor het kleinste HTML-fragment dat elke fout reproduceert.
  7. Sluit de renderer af in de afsluit-hooks van de worker.
FoutWaar deze moet worden afgehandeldAanbevolen respons
Chrome-binary ontbreektDe deploymentcontrole en het constructiepad van de renderer.Laat de readiness-controle mislukken voordat u renderverkeer accepteert.
Te grote HTMLHTML-beleid.Weiger voordat Chrome wordt gestart.
Browser-time-outRenderergrens.Laat de render mislukken en leg de templatenaam, grootte, breedte en time-out vast.
ParserfoutImportgrens.Bewaar een kleine opgeschoonde fixture voor het opsporen van fouten wanneer het beleid dit toestaat.
Lek van browserprocessenLevenscyclus van de worker.Sluit de renderer af bij het afsluiten en herstart na een gecontroleerd aantal renders.
AandachtspuntStandaardWanneer te overschrijven
Render-time-out30 seconden.Verhoog dit alleen voor gemeten, begrensde documenten.
Maximale HTML-grootte5,000,000 bytes.Verlaag dit voor publieke endpoints.
SandboxIngeschakeld.Schakel dit alleen uit wanneer containerbeperkingen dit vereisen en de host geïsoleerd is.
HoogteAutomatisch wanneer heightPt <= 0.Gebruik een vaste hoogte voor strikte lay-outcontracten.
Externe resourcesGeblokkeerd door het rendererbeleid.Sta dit alleen toe via een beoordeeld resourcebeleid.
  • Rendertests dekken representatieve HTML en CSS.
  • Beveiligingstests dekken te grote HTML en geblokkeerde pogingen om resources te laden.
  • Importtests bevestigen dat het geretourneerde form-object inhoud, een media box en resources heeft.
  • Parsertests dekken de cross-reference-tabel (xref), de xref-stream, de object-stream en gevallen met onjuist opgemaakte fixtures.
  • Workertests roepen close() aan en verifiëren dat er geen browserproces overblijft.
  • Performancetests leggen de rendertijd vast per template en inhoudsgrootte.