Salta ai contenuti

Produrre output PDF/A-4 e applicare un controllo di conformità con veraPDF

Questa ricetta genera output PDF/A-4 con il PdfAManager Premium, esegue veraPDF e usa il suo verdetto come controllo di build. La libreria produce gli artefatti; il validatore decide la conformità. La ricetta segue examples/32-pdfa4-icc.php.

  • Core installato: composer require nextpdf/core:^3.
  • Premium installato: composer require nextpdf/pro. PDF/A-4 è una funzionalità di livello Premium (ADR-011). Senza Premium, enablePdfA() genera InvalidConfigException con un percorso di aggiornamento indicato.
  • veraPDF in PATH per il passaggio di verifica.
  1. Interrogare il registro delle capacità per security.pdfa in modo che un’installazione solo Core riceva un messaggio chiaro anziché una traccia dello stack.
  2. Creare il documento e chiamare enablePdfA() prima di aggiungere contenuti.
  3. Impostare i metadati e scrivere il contenuto. Non chiamare setEncryption(); PDF/A vieta la chiave Encrypt.
  4. Salvare. Durante save(), il PdfAManager pianifica l’OutputIntent, il profilo ICC incorporato e gli schemi di estensione XMP.
  5. Eseguire verapdf --flavour 4 sull’output. Far fallire la build se il codice di uscita è diverso da zero. Il verdetto del validatore è il controllo.
<?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";

Quando il controllo veraPDF viene superato:

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

Quando il pacchetto Premium è assente, lo script termina con codice diverso da zero, restituisce un messaggio con indicazioni operative e non scrive alcun file.

  • Controllo Premium. In un’installazione solo Core, enablePdfA() genera InvalidConfigException indicando security.pdfa e la soluzione composer require nextpdf/pro. Interrogare prima il registro.
  • Conflitto di cifratura. Chiamare setEncryption(), useAesGcm() o setPublicKeyEncryption() su un documento PDF/A solleva un’eccezione di incompatibilità in qualsiasi ordine di chiamata. PDF/A vieta la chiave Encrypt del trailer.
  • Variante di conformità. Passare un PdfAVersion a enablePdfA() per selezionare 4e o 4f. Il valore predefinito è 4.
  • Il controllo spetta al validatore, non al motore. Un save() riuscito significa che NextPDF ha emesso gli artefatti richiesti da PDF/A-4. Di per sé, non dimostra la conformità. veraPDF attesta la conformità; questa ricetta usa il suo verdetto come controllo. Non dichiarare che un file è conforme a PDF/A-4 finché il validatore non supera il controllo.
AffermazioneSpecificaClausolareference_id
Un file PDF/A-4 può specificare le proprie caratteristiche di colore con un OutputIntent PDF/A che fa riferimento a un profilo ICC incorporato (il colore indipendente dal dispositivo può essere specificato anche direttamente; §6.2.4.1).ISO 19005-4§6.2.3
La cifratura è vietata in PDF/A-4.ISO 19005-4§6.6.4
PDF/A-4 include l’identificazione pdfaid nei metadati XMP.ISO 19005-4§6.7.5

Il validatore attesta la conformità. La libreria produce un output destinato a essere conforme; il validatore decide.