Zum Inhalt springen

PDF/A-4-Ausgabe erzeugen und mit dem veraPDF-Oracle absichern

Dieses Recipe erzeugt eine PDF/A-4-Ausgabe mit dem Premium-PdfAManager, führt veraPDF aus und verwendet dessen Urteil als Build-Gate. Die Library erzeugt die Artefakte; der Validator entscheidet über die Konformität. Das Recipe folgt examples/32-pdfa4-icc.php.

  • Core installiert: composer require nextpdf/core:^3.
  • Premium installiert: composer require nextpdf/pro. PDF/A-4 gehört zur Premium-Stufe (ADR-011). Ohne Premium wirft enablePdfA() eine InvalidConfigException und nennt einen Upgrade-Pfad.
  • veraPDF im PATH für den Gate-Schritt.
  1. Fragen Sie die Capability-Registry nach security.pdfa ab, damit eine reine Core-Installation eine klare Meldung statt eines Stack-Traces erhält.
  2. Erstellen Sie das Dokument und rufen Sie enablePdfA() auf, bevor Sie Inhalt hinzufügen.
  3. Setzen Sie Metadaten und schreiben Sie Inhalt. Rufen Sie nicht setEncryption() auf; PDF/A verbietet den Encrypt-Schlüssel.
  4. Speichern Sie die Datei. Beim Aufruf von save() plant der PdfAManager den OutputIntent, das eingebettete ICC-Profil und die XMP-Erweiterungsschemata ein.
  5. Führen Sie verapdf --flavour 4 für die Ausgabe aus. Lassen Sie den Build bei einem Exit-Code ungleich null fehlschlagen. Das Urteil des Validators ist das Gate.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
use NextPDF\Exception\InvalidConfigException;
use NextPDF\Support\CapabilityRegistry;
$out = __DIR__ . '/archival.pdf';
// Step 1 — probe before activating a Premium-gated feature.
$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);
}
try {
$doc = Document::createStandalone();
// Step 2 — enable PDF/A-4 before content. Defaults to PdfA4.
$doc->enablePdfA();
// Step 3 — metadata and content. No setEncryption() on a PDF/A document.
$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);
// Step 4 — save. PdfAManager emits OutputIntent + ICC + XMP here.
$doc->save($out);
} catch (InvalidConfigException $e) {
fwrite(STDERR, "PDF/A-4 activation failed: {$e->getMessage()}\n");
exit(1);
}
// Step 5 — the gate. veraPDF, not the library, asserts conformance.
$exitCode = 0;
$output = [];
exec('verapdf --flavour 4 ' . escapeshellarg($out), $output, $exitCode);
if ($exitCode !== 0) {
fwrite(STDERR, "veraPDF FAILED — output is not PDF/A-4 conforming\n");
fwrite(STDERR, implode("\n", $output) . "\n");
exit(1);
}
echo "veraPDF PASS — archival.pdf is reported PDF/A-4 conforming by veraPDF\n";

Wenn veraPDF erfolgreich ist:

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

Fehlt das Premium-Paket, beendet sich das Skript mit einem Exit-Code ungleich null, gibt eine umsetzbare Meldung aus und schreibt keine Datei.

  • Premium-Gate. enablePdfA() wirft in einer reinen Core-Installation eine InvalidConfigException, die security.pdfa nennt und den Lösungsweg composer require nextpdf/pro angibt. Fragen Sie zuerst die Registry ab.
  • Verschlüsselungskonflikt. Der Aufruf von setEncryption(), useAesGcm() oder setPublicKeyEncryption() an einem PDF/A-Dokument löst in beiden Aufrufreihenfolgen eine Inkompatibilitäts-Exception aus. PDF/A verbietet den Trailer-Schlüssel Encrypt.
  • Konformitätsvariante. Übergeben Sie eine PdfAVersion an enablePdfA() für 4e oder 4f. Der Standard ist 4.
  • Das Gate ist der Validator, nicht die Engine. Ein erfolgreiches save() bedeutet, dass NextPDF die Artefakte ausgegeben hat, die PDF/A-4 verlangt. Für sich allein belegt das keine Konformität. veraPDF bestätigt die Konformität; dieses Recipe macht dessen Urteil zum Gate. Behaupten Sie erst dann, dass eine Datei PDF/A-4-konform ist, wenn der Validator erfolgreich ist.
AussageSpezifikationAbschnittreference_id
Eine PDF/A-4-Datei darf ihre Farbcharakteristik über einen PDF/A-OutputIntent angeben, der auf ein eingebettetes ICC-Profil verweist (geräteunabhängige Farbe kann stattdessen direkt angegeben werden; §6.2.4.1).ISO 19005-4§6.2.3
Verschlüsselung ist in PDF/A-4 verboten.ISO 19005-4§6.6.4
PDF/A-4 enthält die pdfaid-Kennzeichnung in den XMP-Metadaten.ISO 19005-4§6.7.5

Der Validator bestätigt die Konformität. Die Library erzeugt eine Ausgabe, die konform sein soll; das Oracle entscheidet.