Ga naar inhoud

Snelstart met Artisan

Koppel een ChromeRendererConfig aan een NextPDF-document, roep writeHtmlChrome() aan en sla het Portable Document Format (PDF)-bestand op. Chrome rendert de Hypertext Markup Language (HTML). De bridge importeert het resultaat als Form XObject en houdt de tekst selecteerbaar.

writeHtmlChrome() is een methode op het NextPDF-core-Document. De HasTextOutput-concern levert deze methode. De methode valideert de invoer en bepaalt de Artisan-renderer. Daarna stuurt de methode de HTML naar Chrome, parseert de geretourneerde PDF en voegt pagina 0 als Form XObject in op de huidige cursorpositie. De publieke signatuur is writeHtmlChrome(string $html, ?float $width = null, ?float $height = null): static en is geverifieerd aan de hand van nextpdf/coresrc/Core/Concerns/HasTextOutput.php.

quickstart.php
<?php
declare(strict_types=1);
use NextPDF\Core\Document;
use NextPDF\Artisan\ChromeRendererConfig;
require __DIR__ . '/vendor/autoload.php';
$config = new ChromeRendererConfig(
chromeBinaryPath: '/usr/bin/chromium',
);
$doc = Document::createStandalone();
$doc->setChromeRendererConfig($config);
$doc->addPage();
$doc->writeHtmlChrome('
<div style="display: flex; gap: 20px; font-family: sans-serif;">
<div style="flex: 1; background: #f0f0f0; padding: 24px;">
<h2>Revenue</h2><p style="font-size: 2em; color: #2563eb;">$124,500</p>
</div>
<div style="flex: 1; background: #f0f0f0; padding: 24px;">
<h2>Orders</h2><p style="font-size: 2em; color: #16a34a;">1,847</p>
</div>
</div>
');
$doc->save('/tmp/report.pdf');

Dit is de canonieke flow uit de README.md van het pakket. Chrome verwerkt de Cascading Style Sheets (CSS)-flex-lay-out. De getallen blijven in de uitvoer als tekst selecteerbaar, omdat de pagina als Form XObject wordt ingebed en niet als rasterafbeelding.

Geef een expliciete breedte en hoogte in PDF-punten op, zodat de uitvoer op een vast paginaformaat past (A4 weergegeven):

$doc->writeHtmlChrome($html, width: 595.28, height: 841.89);

Wanneer je beide waarden opgeeft, drukt Chrome precies op dat papierformaat af. Wanneer je de hoogte weglaat (of null doorgeeft), past de bridge zich aan de gemeten contenthoogte aan en voegt een kleine veiligheidsbuffer voor reflow toe. Zie /integrations/artisan/production-usage/ voor de reden waarom die buffer bestaat en wanneer je deze overschrijft.

EigenschapGedrag
TekstSelecteerbaar en doorzoekbaar (vectortekst, niet gerasterd)
Cascading Style Sheets (CSS)Chrome-lay-out: flexbox, grid, complexe selectors, webfonts via data-Uniform Resource Identifier (URI)-waarden
NetwerkGeen subresource-ophalingen; externe Uniform Resource Locators (URLs) worden niet geladen (zie /integrations/artisan/security-and-operations/)
Pagina’sPagina 0 van de Chrome-uitvoer wordt geïmporteerd
  • Lege HTML heeft geen effect. writeHtmlChrome('') retourneert het document ongewijzigd (geverifieerd in HasTextOutput::writeHtmlChrome).
  • Nog geen pagina aanwezig. Als het document geen pagina heeft, voegt writeHtmlChrome() er een toe vóór het renderen.
  • Externe assets laden niet. <img src="https://..."> rendert leeg. Neem assets inline op als data:-URI’s. Dit hoort bij de netwerkisolatie; het is geen bug. Zie /integrations/artisan/security-and-operations/.
  • Bridge ontbreekt. Als nextpdf/artisan niet is geïnstalleerd, werpt de core een layout-uitzondering in plaats van een fatale fout.

Bij de eerste aanroep tellen de opstart- en layouttijd van Chrome mee. Volgende aanroepen hergebruiken het actieve Chrome-proces via BrowserPool. Lees voor batchtaken of langlopende workers de richtlijnen over levenscyclus en resources op de pagina /integrations/artisan/production-usage/.

De snelstart gebruikt vertrouwde, hard-gecodeerde HTML. Voordat je HTML die door gebruikers kan worden beïnvloed aan writeHtmlChrome() doorgeeft, lees je /integrations/artisan/security-and-operations/. De bridge isoleert netwerktoegang, maar HTML-rendering heeft nog steeds een aanvalsoppervlak.

Dit produceert een PDF uit HTML met de open-source bridge. Om een conform e-factuur-Extensible Markup Language (XML)-bestand in hetzelfde document in te bedden, levert het Premium Pro-niveau een embedder. Het open-source pad blijft onaangetast wanneer Premium ontbreekt.

  • /integrations/artisan/install/
  • /integrations/artisan/configuration/
  • /integrations/artisan/production-usage/
  • /integrations/artisan/troubleshooting/
  • /integrations/artisan/security-and-operations/