Zum Inhalt springen

PDF/A-4-Archivausgabe erstellen

Dieses Recipe erzeugt eine PDF/A-4-Archivausgabe (ISO 19005-4) über den Pro-PdfAManager. Beim Speichern gibt NextPDF den OutputIntent, das eingebettete ICC-Profil und die Identifikationsmetadaten aus. NextPDF erzeugt eine auf Konformität ausgelegte Ausgabe; über die Konformität entscheidet ein unabhängiger Validator. Das Recipe folgt examples/32-pdfa4-icc.php.

Terminal-Fenster
composer require nextpdf/core:^3
composer require nextpdf/pro

PDF/A-4 ist eine Funktion der Pro-Edition. In einer reinen Core-Installation löst enablePdfA() eine InvalidConfigException aus. Die Meldung nennt die fehlende Fähigkeit security.pdfa und die Abhilfe composer require nextpdf/pro. Für den Prüfschritt muss ein PDF/A-Validator im PATH verfügbar sein. Die Beispiele verwenden veraPDF mit --flavour 4.

PDF/A-4 ist das Archivprofil nach ISO 19005-4, das auf ISO 32000-2 (PDF 2.0) aufbaut. Eine konforme Datei ist farblich deterministisch und in sich geschlossen. Sie deklariert einen OutputIntent, der auf ein eingebettetes ICC-Zielprofil verweist, sodass sich Farbe ohne externe Ressourcen reproduzieren lässt (§6.2.3). Jedes Schriftprogramm ist eingebettet (§6.2.10.4.1). Das Dokument enthält pdfaid-Identifikationsmetadaten in XMP (§6.7.3). Die Datei ist nicht verschlüsselt (§6.6.4 — PDF/A verbietet den Trailer-Schlüssel Encrypt).

NextPDF modelliert PDF/A über das typisierte Enum ConformanceMode. enablePdfA() instanziiert den Pro-PdfAManager und verwendet standardmäßig ConformanceMode::PdfA4. Während save() gibt der Manager den OutputIntent, den ICC-Stream und die XMP-Erweiterungsschemata aus. Die Diskriminatoren pdfaPart() und pdfaConformanceLetter() halten die Metadaten pdfaid:part / pdfaid:conformance mit der gewählten Variante konsistent (Basis 4, 4e, 4f). Das Basisprofil gibt keinen pdfa:conformance-Buchstaben aus, wie es der Teil vorschreibt.

Die API-Oberfläche wird aus PHPDoc generiert. Die wichtigsten Einstiegspunkte:

  • \NextPDF\Core\Document::createStandalone(): Document
  • Document::enablePdfA(?object $version = null): static
  • \NextPDF\Support\CapabilityRegistry::getInstance()->get('security.pdfa')->isAvailable(): bool
  • \NextPDF\Conformance\ConformanceMode::PdfA4 / PdfA4e / PdfA4f
  • ConformanceMode::pdfaPart(): 2|3|4|null und ConformanceMode::pdfaConformanceLetter(): string
examples/32-pdfa4-icc.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use NextPDF\Core\Document;
use NextPDF\Support\CapabilityRegistry;
$out = __DIR__ . '/output/32-pdfa4-icc.pdf';
// Probe before activating a Pro-gated feature so a Core-only install
// gets an actionable message instead of a stack trace.
$registry = CapabilityRegistry::getInstance();
if (!$registry->get('security.pdfa')->isAvailable()) {
fwrite(STDERR, "PDF/A-4 requires nextpdf/pro. Run: composer require nextpdf/pro\n");
exit(1);
}
$doc = Document::createStandalone();
$doc->enablePdfA(); // defaults to ConformanceMode::PdfA4
$doc->setTitle('Archival Record 2026-0042');
$doc->setLanguage('en');
$doc->addPage();
$doc->setFont('helvetica', '', 12);
$doc->cell(0, 10, 'This document targets PDF/A-4.', newLine: true);
$doc->save($out); // PdfAManager emits OutputIntent + ICC + XMP here
echo "Created: output/32-pdfa4-icc.pdf\n";

Dies ist das in sich geschlossene, im Harness ausführbare Programm. Der Produktionsaufruf macht das Urteil des Validators zum Build-Gate. Ein erfolgreiches save() belegt, dass NextPDF die Artefakte ausgegeben hat; nur der Validator belegt die Konformität.

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
use NextPDF\Exception\InvalidConfigException;
use NextPDF\Support\CapabilityRegistry;
$out = getenv('NEXTPDF_COOKBOOK_OUTPUT') ?: (__DIR__ . '/archival.pdf');
if (!CapabilityRegistry::getInstance()->get('security.pdfa')->isAvailable()) {
fwrite(STDERR, "PDF/A-4 requires nextpdf/pro. Run: composer require nextpdf/pro\n");
exit(1);
}
try {
$doc = Document::createStandalone();
$doc->enablePdfA(); // ConformanceMode::PdfA4
$doc->setTitle('Archival Record 2026-0042');
$doc->setLanguage('en');
$doc->addPage();
$doc->setFont('helvetica', '', 12);
$doc->cell(0, 10, 'Long-term archival record. PDF/A-4 (ISO 19005-4).', newLine: true);
// Do NOT call setEncryption(): PDF/A prohibits the Encrypt key and
// the call raises an incompatibility exception in either order.
$doc->save($out);
} catch (InvalidConfigException $e) {
fwrite(STDERR, "PDF/A-4 activation failed: {$e->getMessage()}\n");
exit(1);
}
$exitCode = 0;
$report = [];
exec('verapdf --flavour 4 ' . escapeshellarg($out), $report, $exitCode);
if ($exitCode !== 0) {
fwrite(STDERR, "veraPDF FAILED — output is not PDF/A-4 conforming\n");
fwrite(STDERR, implode("\n", $report) . "\n");
exit(1);
}
echo "veraPDF PASS — archival.pdf is reported PDF/A-4 conforming\n";

Die erwartete STDOUT-Ausgabe auf einem Host, auf dem nextpdf/pro installiert ist und verapdf die Datei als konform meldet, lautet:

veraPDF PASS — archival.pdf is reported PDF/A-4 conforming

Auf einem reinen Core-Host endet das Programm mit einem Wert ungleich null, nachdem PDF/A-4 requires nextpdf/pro. Run: composer require nextpdf/pro auf STDERR ausgegeben wurde. Wenn verapdf ein Problem meldet, endet das Programm mit einem Wert ungleich null, nachdem veraPDF FAILED — output is not PDF/A-4 conforming ausgegeben wurde. Die Formulierung ordnet das Urteil veraPDF zu — NextPDF behauptet keine PDF/A-4-Konformität.

  • Pro-Gate. In einer reinen Core-Installation wirft enablePdfA() eine InvalidConfigException. Die Meldung nennt security.pdfa und die Abhilfe composer require nextpdf/pro. Fragen Sie zuerst die Registry ab, um eine klare Operator-Meldung zu erhalten.
  • Verschlüsselungskonflikt. Der Aufruf von setEncryption(), useAesGcm() oder setPublicKeyEncryption() auf einem PDF/A-Dokument löst in beliebiger Aufrufreihenfolge eine Inkompatibilitäts-Exception aus — PDF/A-4 verbietet den Trailer-Schlüssel Encrypt (ISO 19005-4 §6.6.4).
  • Konformitätsvariante. Übergeben Sie die Pro-PdfAVersion an enablePdfA() für 4e (Engineering, 3D) oder 4f (Dateianhänge). Das Basisprofil gibt keinen pdfa:conformance-Buchstaben aus; 4e/4f setzen E/F. Der Diskriminator ConformanceMode hält pdfaid:part konsistent.
  • Tagging ist unabhängig. PDF/A-4 Basis behandelt Tagging als optional. Für ein zugleich barrierefreies und archivtaugliches Ergebnis aktivieren Sie den getaggten Modus und PDF/A getrennt; siehe das PDF/UA-2-Recipe.
  • Das Gate ist der Validator. Ein erfolgreiches save() bedeutet, dass die Artefakte ausgegeben wurden, nicht dass die Datei konform ist. Behaupten Sie keine PDF/A-4-Konformität, bevor der Validator besteht.

Der OutputIntent fügt einen ICC-Profil-Stream (einige hundert KB für sRGB) sowie das XMP-Paket hinzu. Die Schrifteinbettung dominiert die Dateigröße, wenn das Dokument Schriften außerhalb der Base-14 verwendet. Für typische Archivdokumente bleibt das Recipe innerhalb des Budgets von 2000 ms / 128 MB. Es gilt das Profil der semantischen Reproduzierbarkeit: Ein auf Validatoren ausgerichtetes Ergebnis wird über einen strukturellen AST plus Metadaten verglichen, nicht über rohe Bytes.

Eine Archivausgabe ist von Natur aus langlebig und in sich geschlossen. Alle personenbezogenen Daten im Inhalt bleiben über die Lebensdauer des Archivs erhalten. Das eingebettete ICC-Profil und die Metadaten werden mit der Datei weitergegeben. Wenden Sie vor der Archivierung eine Aufbewahrungs- und Minimierungsrichtlinie an. PDF/A-4 hat keine Schwärzungssemantik.

Das Recipe schreibt nur eine feste Fortschrittszeile. Die veraPDF-Ausgabe kann Inhaltsfragmente enthalten — halten Sie Validator-Logs bei Dokumenten mit sensiblem Inhalt aus gemeinsam genutzten Log-Senken heraus.

PDF/A-4 ist ein Profil für Archivtreue, keine Integritäts- oder Authentizitätskontrolle. Es signiert die Datei nicht und macht Manipulationen nicht erkennbar. Kombinieren Sie es mit einer Signatur, wenn die Herkunft wichtig ist. Ein separates Recipe behandelt die Signatur. Verschlüsselung schließt sich laut Spezifikation mit PDF/A gegenseitig aus.

Dieses Recipe führt keine kryptografische Operation aus. Der FIPS-Modus ändert sein Verhalten nicht. PDF/A-4 verbietet Verschlüsselung, daher wird kein Cipher ausgewählt.

AussageSpezifikationKlauselreference_id
PDF/A-4 erfordert einen OutputIntent, der auf ein eingebettetes ICC-Profil verweist.ISO 19005-4§6.2.3
Farbe ist über das Ausgabezielprofil geräteunabhängig.ISO 19005-4§6.2.4.3
Jedes Schriftprogramm ist eingebettet.ISO 19005-4§6.2.10.4.1
Das Dokument enthält pdfaid-Identifikation in XMP.ISO 19005-4§6.7.3
Verschlüsselung ist in PDF/A-4 verboten.ISO 19005-4§6.6.4
Über die Konformität entscheidet ein Validator, nicht der Erzeuger.ISO 19005-4§6.7.3

NextPDF erzeugt eine Ausgabe, die auf PDF/A-4-Konformität ausgelegt ist. Unterstützung ist nicht Konformität; ein getestetes Profil ist keine Zertifizierung. Dieses Recipe behauptet keine Konformität; ein unabhängiger Validator (zum Beispiel veraPDF) trifft diese Feststellung. Machen Sie sein Urteil zum Build-Gate.