Ga naar inhoud

Overzicht van NextPDF Artisan

NextPDF Artisan is de Chrome-brug voor NextPDF. De brug stuurt een fragment in Hypertext Markup Language (HTML) via het Chrome DevTools Protocol (CDP) naar een headless Chrome-proces, legt de uitvoer van printToPDF vast en neemt het resultaat als een Form XObject op in het doeldocument in Portable Document Format (PDF). De ingesloten tekst blijft selecteerbaar en doorzoekbaar.

Het Artisan-pakket (nextpdf/artisan) breidt de opensource-engine NextPDF uit met een renderer die de lay-out aan Chrome delegeert. De native HTML-pijplijn van NextPDF dekt al een brede subset van Cascading Style Sheets (CSS). Gebruik de Artisan-brug voor documenten die lay-out op Chrome-niveau nodig hebben, zoals CSS-flexbox en -grid, aangepaste weblettertypen die via een Uniform Resource Identifier (URI) uit databronnen worden geladen en complexe selectors, terwijl de uitvoer vectortekst blijft in plaats van een gerasterde schermafbeelding.

De brug werkt als een pijplijn van kleine componenten met elk één doel. ChromeHtmlRenderer orkestreert een render. ChromeSecurityPolicy valideert de invoer en verpakt die in een vergrendeld HTML-document. BrowserPool beheert de levenscyclus van het Chrome-proces. ViewportCalculator zet PDF-punten om naar CSS-pixels. De NextPDF\Parser-lezer parseert de Chrome-uitvoer en PageImporter zet die om naar een Form XObject. Elke component is final, via de constructor geïnjecteerd en getypeerd op PHPStan-niveau 10.

De brug heeft externe afhankelijkheden. Hij heeft de bibliotheek chrome-php/chrome (^1.15) nodig, plus een Chrome- of Chromium-binary die bereikbaar is voor het PHP-proces. Geen van beide wordt meegeleverd. Als de bibliotheek ontbreekt, werpt de brug ChromeNotAvailableException in plaats van stilzwijgend te falen; zie /integrations/artisan/failure-modes/ op de pagina /integrations/artisan/troubleshooting/.

De renderer stuurt nooit inhoud naar Chrome voordat de invoer ChromeSecurityPolicy::validate() heeft doorstaan. Het document dat Chrome ontvangt, is altijd verpakt met een strikt Content Security Policy (CSP) via de Content-Security-Policy-header en een CDP-netwerkblokkade als verdediging in de diepte. Omdat de brug mogelijk niet-vertrouwde HTML verwerkt, documenteert de pagina /integrations/artisan/security-and-operations/ het transport- en isolatiemodel in plaats van het hier samen te vatten.

Deze pagina beschrijft het gedrag van het pakket zoals het wordt geleverd, geverifieerd aan de hand van src/Artisan/ en de testsuite tests/Unit/Artisan/. Dit is geen claim van pixel-voor-pixelgelijkheid met een interactieve Chrome-browser: animaties worden bij hun laatste frame vastgelegd, de lay-out is niet afhankelijk van JavaScript en alleen de eerste Chrome-pagina wordt geïmporteerd.

HTML fragment

ChromeSecurityPolicy::validate()

ChromeSecurityPolicy::wrapHtml()

CSP + reset CSS

BrowserPool

headless Chrome

CDP: Network.setBlockedURLs '*'

Page.setDocumentContent

Chrome printToPDF

NextPDF\\Parser\\PdfReader

PageImporter → Form XObject

Embedded in target PDF

(text selectable)

Diagram
ComponentVerantwoordelijkheidBron
ChromeHtmlRendererOrkestreert één render; retourneert ChromeRenderResultsrc/Artisan/ChromeHtmlRenderer.php
ChromeRendererConfigOnveranderlijk configuratiewaardeobjectsrc/Artisan/ChromeRendererConfig.php
ChromeSecurityPolicyInvoervalidatie en beveiligde HTML-envelopsrc/Artisan/ChromeSecurityPolicy.php
BrowserPoolLevenscyclus van het Chrome-proces en herstartbeleidsrc/Artisan/BrowserPool.php
ViewportCalculatorConversie van 72 pt/inch ↔ 96 px/inchsrc/Artisan/ViewportCalculator.php
ChromeRenderResultGetypeerde render-uitvoer (ChromeRenderResultInterface)src/Artisan/ChromeRenderResult.php
PageImporterGeparseerde Chrome-pagina → ImportedFormXObjectsrc/Artisan/PageImporter.php
EInvoiceServiceFactoryContainervrije factory voor Premium e-invoice-contractensrc/Artisan/EInvoiceServiceFactory.php
  • Versieherkomst. Het gepubliceerde Composer-artefact heeft de tag v0.1.0. Docblocks in de broncode bevatten @since 1.7.0 (Chrome-brug) en @since 1.1.0 (e-invoice-factory), beide overgenomen van de versielijn nextpdf/core van vóór de hernoeming; het pakket is hernoemd naar nextpdf/artisan in de CHANGELOG-vermelding van 2.0.0. Beschouw de Composer-tag als de gezaghebbende installatieversie en de @since-markeringen als engineversiegeschiedenis.
  • Alleen de eerste pagina. PageImporter::import() gaat standaard uit van pagina-index 0. Inhoud die naar een tweede Chrome-pagina overloopt, wordt afgekapt tenzij je een expliciete hoogte opgeeft, zoals behandeld op de pagina /integrations/artisan/production-usage/.
  • Geen dependency-injection-container (DI-container). Artisan is containerloos. EInvoiceServiceFactory biedt omgevingen zonder servicecontainer een consistente manier om services te instantiëren; zie /integrations/artisan/boot-and-discovery/.

Bij elke render wordt de Chrome-pagina geladen en wordt printToPDF eenmaal per aanroep uitgevoerd. BrowserPool houdt het Chrome-proces tussen renders in leven en herstart het elke 100 renders om de geheugengroei te begrenzen. Het lay-outwerk van Chrome, niet de brug zelf, domineert het Big-O-gedrag. Voor het gemeten budget van de referentieflow op deze pagina raadpleeg je performance_budget in de frontmatter en de pagina /integrations/artisan/production-usage/.

De brug rendert mogelijk niet-vertrouwde HTML binnen Chrome. De invoer wordt op grootte en inhoud gevalideerd voordat Chrome deze ziet. Het verpakte document bevat default-src 'none'. Een blokkade op CDP-niveau stopt elke subresource-aanvraag. Het volledige transport- en isolatiemodel, inclusief de expliciete grenzen van de Chrome-sandboxvlag, staat op de pagina /integrations/artisan/security-and-operations/. Beschouw deze sectie niet als de volledige beveiligingshouding.

De opensource-brug rendert HTML naar PDF. De Premium-niveaus voegen conforme e-invoice-insluiting (Pro) en validatie (Enterprise) toe bovenop het gerenderde document. Als die niveaus niet zijn geïnstalleerd, retourneert EInvoiceServiceFactory null, zodat het opensource-pad ook zonder die niveaus volledig functioneel blijft.

  • /integrations/artisan/install/
  • /integrations/artisan/configuration/
  • /integrations/artisan/quickstart/
  • /integrations/artisan/chrome-renderer-setup/
  • /integrations/artisan/security-and-operations/
  • /integrations/artisan/production-usage/