Zum Inhalt springen

Render-Manifest: die portable Rendering-Anfrage

Ein Render-Manifest ist eine einzelne, portable Beschreibung davon, was gerendert werden soll: Eingabe, Template, Schriften, Locale, Konformitätsprofil, Signaturrichtlinie, Ausgabeziel und ein Fast-Web-View-Flag. Jeder Transport (CLI, eine Framework-Integration, eine SaaS-API, ein künftiger Stream-Connector) erstellt dasselbe RenderManifest und reicht es ein. Der Vertrag ist deterministisch: Zwei identische Manifeste werden zu bytegleichem JSON serialisiert, und jedes Manifest trägt einen abgeleiteten Idempotenzschlüssel, sodass derselbe Rendervorgang nachgelagert erkannt und dedupliziert werden kann.

Das Manifest ist ein Core-Vertrag. Es definiert das Schema; die Engine und der Premium-Stream-Prozessor führen es aus.

Terminal-Fenster
composer require nextpdf/core:^3

Der stabile Weg zur Erstellung ist der Builder (oder RenderManifest::fromArray() für ein deserialisiertes Manifest). Der direkte Konstruktor ist @internal: Neue optionale Felder werden mit Standardwerten angehängt, sodass der Builder und fromArray() sie aufnehmen, ohne bestehende Aufrufstellen zu brechen.

examples/manifest/build.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Manifest\OutputObjectKey;
use NextPDF\Manifest\RenderManifestBuilder;
use NextPDF\Manifest\TemplateRef;
$manifest = RenderManifestBuilder::create('invoice-2026-0001')
->withInlineInput('<h1>Invoice 2026-0001</h1>')
->withTemplate(TemplateRef::html())
->withOutputKey(OutputObjectKey::file('invoices', '2026-0001.pdf'))
->withLocale('en-US')
->linearized()
->build();
// Deterministic, canonical-key-order JSON — equal manifests are byte-identical.
$json = $manifest->toJson();
FeldBedeutung
jobIdAufruferstabile logische ID, die in Events und Belegen widergespiegelt wird. Vom Idempotenzschlüssel ausgeschlossen.
idempotencyKeyDeterministischer Dedup-Schlüssel (siehe unten).
inputQuelle der Renderdaten: Inline-Payload, eine URI oder eine Dataset-Referenz plus Content-Hash.
templateDas Rendering-Frontend und eine optionale Template-ID.
fontsDeklarierter Schriftsatz (standardmäßig leer).
localeEin BCP-47-Sprach-Tag (standardmäßig en-US).
conformanceProfileEine stabile Profil-ID (standardmäßig none).
signaturePolicyEine stabile Richtlinien-ID (standardmäßig none).
targetAusgabeobjekt-Schlüssel, Format und Clobber-Richtlinie.
linearizeFast-Web-View-Flag; kombinierbar mit Linearisierung.
metadataEine opake, skalare key/value-Map, die in Events widergespiegelt wird.

IdempotencyKey::derive() hasht nur die für das Rendering maßgebliche Teilmenge des Manifests: Template, Content-Hash der Eingabe, Schriften, Locale, Konformität, Signaturrichtlinie, das Linearisierungs-Flag und den Zielschlüssel. Es schließt jobId und metadata bewusst aus, sodass zwei Anfragen mit identischen, für das Rendering maßgeblichen Eingaben, einschließlich des Ausgabeziels, einen Schlüssel teilen und dedupliziert werden können, selbst wenn sich ihre Job-IDs oder Tracking-Metadaten unterscheiden. Ein Aufrufer kann auch einen expliziten Schlüssel angeben; isDerived() meldet, auf welchem Weg er erzeugt wurde.

Die Schema-Version wird durch RenderManifest::SCHEMA_VERSION festgelegt (derzeit 1.0). Innerhalb einer Hauptversion erfolgt die Entwicklung rein additiv: Ein Leser toleriert unbekannte Schlüssel aus einem neueren Minor-Schema, während eine neuere Hauptversion abgelehnt wird. SchemaCompatibility::assertReadable() erzwingt dies bei fromArray(), und canRead() / isForwardRead() ermöglichen es Aufrufern, die Kompatibilität zu testen, ohne eine Ausnahme zu werfen.

Da das Manifest ein readonly-DTO mit @internal-Konstruktor ist, erstellen Sie es über den Builder oder fromArray(). Neue Felder werden als additive Konstruktorparameter mit Standardwerten ergänzt, sodass eine Felderweiterung für diese Aufrufstellen keine brechende Änderung ist.

RenderManifestValidator::validate() wirft keine Ausnahmen und sammelt alle Probleme: Es gibt eine Liste aller gefundenen Probleme zurück, statt beim ersten zu scheitern. Es lehnt unsichere Ausgabeschlüssel (Traversal, absolute Pfade, Stream-Wrapper), mehr als eine Eingabequelle, eine unbekannte Konformitätsprofil-ID, eine ungültige BCP-47-Locale und eine Clobber-Richtlinien-Inkonsistenz ab. warnings() gibt empfehlende, nicht blockierende Hinweise zurück.

use NextPDF\Manifest\RenderManifestValidator;
$problems = (new RenderManifestValidator())->validate($manifest);
if ($problems !== []) {
// Each entry is a stable, human-readable problem string.
}

SingleDocumentRenderer erzeugt aus einem Manifest deterministisch ein PDF. Er arbeitet ohne Seiteneffekte: Er gibt Bytes plus deren sha-256-Digest zurück und schreibt keine Datei. Dadurch bleiben Staging und Exactly-once-Commit Sache des Aufrufers (oder des Stream-Prozessors).

use NextPDF\Manifest\Render\SingleDocumentRenderer;
use NextPDF\Manifest\Render\StandaloneDocumentFactory;
$renderer = new SingleDocumentRenderer(new StandaloneDocumentFactory());
$outcome = $renderer->render($manifest);
$bytes = $outcome->bytes;
$digest = $outcome->sha256;
$pages = $outcome->pageCount;
TypArtWichtige MitgliederStabilitätSeit
RenderManifestreadonly-DTOtoArray(), toJson(), fromArray(), canonicalDigestInput(), SCHEMA_VERSIONstabil3.2.0
RenderManifestBuilderBuildercreate(), with*(), linearized(), build()stabil3.2.0
IdempotencyKeyValue Objectof(), derive(), equals(), isDerived()stabil3.2.0
SchemaCompatibilityHelfercanRead(), isForwardRead(), assertReadable()stabil3.2.0
RenderManifestValidatorServicevalidate(), warnings()stabil3.2.0
SingleDocumentRendererServicerender(): RenderOutcomestabil3.2.0

fromArray() wirft RenderManifestException, wenn ein Pflichtfeld fehlt oder die Schema-Version nicht lesbar ist.