Ir al contenido

Conformidad PDF/A-4: lo que NextPDF emite según ISO 19005-4

Declaración de límite. NextPDF produce una salida destinada a conformar con PDF/A-4; la biblioteca no declara la conformidad: lo hace un validador (por ejemplo, veraPDF).

PDF/A-4 es ISO 19005-4:2020, el perfil de archivado basado en PDF 2.0. NextPDF Core lleva el discriminador ConformanceMode (PdfA4, PdfA4e, PdfA4f). El motor Premium nextpdf/pro emite el OutputIntent, el perfil ICC incrustado y el esquema de identificación XMP pdfaid durante save(). La biblioteca produce los artefactos; veraPDF decide la conformidad. ISO 19005-4 §6.7.3 lo indica explícitamente: las propiedades pdfaid:part/pdfaid:rev «no determinan por sí solas la conformidad».

Ventana de terminal
composer require nextpdf/core:^3
composer require nextpdf/pro # OutputIntent + ICC + XMP authoring

Core registra la capacidad security.pdfa, pero la informa como no disponible sin nextpdf/pro. En ese caso, enablePdfA() lanza InvalidConfigException con una ruta de actualización en lugar de emitir un archivo no conforme.

Document::enablePdfA(?object $version = null) asigna una entrada del enum PdfAVersion a un caso de ConformanceMode. Para entradas no reconocidas, usa ConformanceMode::PdfA4 como valor predeterminado ('4e' → PdfA4e, '4f' → PdfA4f). El modo determina tres obligaciones de emisión que la norma impone a un archivo conforme:

  • OutputIntent + ICC — §6.2.3 permite que un archivo conforme especifique sus características de color con un OutputIntent PDF/A-4 que hace referencia a un flujo ICC DestOutputProfile. Según §6.2.4.1, esta es una de las dos rutas permitidas para especificar color independiente del dispositivo (la otra consiste en espacios de color independientes del dispositivo especificados directamente). Por tanto, el OutputIntent es la ruta que toma NextPDF, no un requisito incondicional de la norma.
  • Identificación pdfaid — §6.7.3 requiere que el XMP a nivel de documento incluya el esquema de identificación PDF/A (el espacio de nombres pdfaid de AIIM), con pdfaid:part/pdfaid:rev. PDF/A-4e y PDF/A-4f establecen además pdfa:conformance (E / F). §6.7.3 también establece que un archivo que no sea conforme con ninguna de esas dos variantes no debe proporcionar un valor pdfa:conformance.
  • Incrustación de fuentes — §6.2.10 requiere que todas las fuentes utilizadas para el renderizado estén incrustadas.

NextPDF emite esos artefactos; no ejecuta la determinación de conformidad de §5. Esa tarea corresponde a veraPDF, y §6.7.3 reserva la determinación a ese proceso.

MétodoEfecto
enablePdfA(?object $version = null): staticEnruta a ConformanceMode::PdfA4/PdfA4e/PdfA4f; programa OutputIntent + ICC + XMP en save(). Lanza InvalidConfigException|PageLayoutException|CompressionException si nextpdf/pro está ausente.
ConformanceMode::pdfaPart(): ?intDevuelve la parte ISO 19005 para el modo activo (4 para PdfA4*).
ConformanceMode::pdfaConformanceLetter(): stringDevuelve la letra pdfa:conformance (E / F) o vacío.
<?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';
$registry = CapabilityRegistry::getInstance();
if (!$registry->get('security.pdfa')->isAvailable()) {
fwrite(STDERR, "PDF/A-4 requires nextpdf/pro.\n");
exit(1);
}
try {
$doc = Document::createStandalone();
$doc->enablePdfA(); // ConformanceMode::PdfA4
$doc->setTitle('Archival Record 2026-0042');
$doc->setLanguage('en');
$doc->writeHtml('<h1>Archival record</h1><p>Body.</p>');
$doc->save($out); // OutputIntent + ICC + XMP scheduled here
} catch (InvalidConfigException $e) {
fwrite(STDERR, $e->getMessage() . "\n");
exit(1);
}
echo "Wrote {$out} — validate: verapdf --flavour 4 {$out}\n";

Envolver el veredicto del validador como una compuerta de compilación. Ejecutar verapdf --flavour 4 sobre la salida y hacer fallar la compilación ante un código de salida distinto de cero. El veredicto del validador es la compuerta: la emisión de la biblioteca es la entrada a esa compuerta, nunca el veredicto en sí. Consultar /cookbook/php/pdfa4-conformance-gate/ para la canalización completa con compuerta.

  • Habilitar antes del contenido. Llamar a enablePdfA() antes de añadir contenido; habilitarlo de forma retroactiva no reprocesa los objetos ya escritos.
  • Sin cifrado. PDF/A prohíbe la clave Encrypt. No llamar a setEncryption() en un documento PDF/A. El cifrado aporta confidencialidad, no integridad de archivado, y ambos son mutuamente excluyentes aquí.
  • pdfa:conformance es condicional. Solo PDF/A-4e y PDF/A-4f lo establecen. Emitirlo en un archivo PDF/A-4 simple constituye por sí mismo una violación de conformidad (§6.7.3): el caso ConformanceMode lo evita por construcción.
  • Adjuntos PDF/A-4f. Los archivos incrustados en un archivo PDF/A-4f deben incluir las claves F y UF (se recomienda Desc) según §6.7.5. Esto respalda la ruta híbrida ZUGFeRD/Factur-X.

La incrustación de OutputIntent + ICC añade un flujo ICC de tamaño fijo (el perfil del espacio de trabajo) y el paquete XMP en save(). El presupuesto es de un tiempo total ≤ 1500 ms y un pico ≤ 128 MB para un documento típico.

PDF/A-4 prohíbe el cifrado. El perfil es una restricción de archivado y longevidad, no un control de seguridad. La custodia de claves y la política del verificador quedan fuera del alcance de este perfil; consultar el centro de confianza.

La emisión de PDF/A-4 se realiza dentro del proceso y escribe únicamente el documento, el perfil ICC incrustado y el paquete XMP. Ningún contenido sale del proceso. La PII en el contenido de origen es responsabilidad del integrador: el perfil no redacta.

Telemetría segura y depuración de registros

Sección titulada «Telemetría segura y depuración de registros»

El ejemplo solo escribe en STDERR la ruta de salida y el comando del validador. No se registran bytes del documento. La recipe respeta NEXTPDF_COOKBOOK_OUTPUT y nunca imprime el PDF en STDOUT.

Un archivo PDF/A-4 no incorpora control de acceso. Cualquiera que tenga el archivo puede leerlo; el perfil garantiza la longevidad del renderizado, no la confidencialidad. El flujo ICC del OutputIntent debe tratarse como público.

La emisión de PDF/A-4 no ejecuta operaciones criptográficas. Una firma digital en un archivo PDF/A-4 (PDF/A-4 §6.5 permite perfiles PAdES) es un asunto aparte, propio de la recipe de firma, y hereda la postura FIPS de esa recipe. Esta página no hace ninguna afirmación sobre firmas.

AfirmaciónNormaCláusulareference_id
Un archivo PDF/A-4 puede especificar sus características de color con un OutputIntent PDF/A que hace referencia a un perfil ICC DestOutputProfile.ISO 19005-4§6.2.3
El color independiente del dispositivo puede especificarse de forma directa o indirecta mediante el DestOutputProfile del OutputIntent (una de las dos rutas permitidas).ISO 19005-4§6.2.4.1
La versión de PDF/A se identifica mediante el esquema de identificación de PDF/A (pdfaid) en el XMP del documento.ISO 19005-4§6.7.3
pdfaid:part / pdfaid:rev no determinan por sí solos la conformidad; la determinación se realiza conforme a la Cláusula 5.ISO 19005-4§6.7.3
Un archivo que no sea conforme ni con PDF/A-4e ni con PDF/A-4f no debe proporcionar un valor pdfa:conformance.ISO 19005-4§6.7.3
Los archivos incrustados de PDF/A-4f requieren las claves F y UF (se recomienda Desc).ISO 19005-4§6.7.5
Todas las fuentes utilizadas para el renderizado deben estar incrustadas.ISO 19005-4§6.2.10
El uso de transparencia / color depende de un OutputIntent declarado.ISO 19005-4§6.2.9

Las citas son punteros de id. de cláusula + reference_id hacia el corpus de verificación. No se reproduce ningún texto de la norma; las cláusulas se resumen en palabras de NextPDF.