Ir al contenido

ISO 19005-4 (PDF/A-4): asignación funcional de NextPDF

ISO 19005-4:2020 (PDF/A-4) es el perfil de archivado de PDF 2.0. Esta página establece su correspondencia con NextPDF de forma explícita: qué emite el núcleo, qué añade la extensión nextpdf/pro y qué queda fuera de la cobertura explícita de NextPDF. NextPDF emite estructuras relevantes para PDF/A-4; solo un validador puede afirmar que un archivo es conforme.

Ventana de terminal
composer require nextpdf/core:^3
# PDF/A-4 file authoring (OutputIntent + ICC + XMP) requires:
# composer require nextpdf/pro

ISO 19005-4:2020 se basa en ISO 32000-2:2020 (PDF 2.0), a diferencia de PDF/A-2 y PDF/A-3, que se basan en ISO 32000-1:2008 (PDF 1.7). NextPDF codifica esta diferencia de linaje en ConformanceMode::requiresPdf17(). Este método devuelve false para todos los casos de PDF/A-4 y true para PDF/A-2 y PDF/A-3.

PDF/A-4 define tres formas de conformidad. El perfil base no tiene letra pdfa:conformance. PDF/A-4e (anexo B, contenido de ingeniería / 3D) establece pdfa:conformance = E. PDF/A-4f (anexo A, archivos incrustados) establece pdfa:conformance = F. ISO 19005-4:2020 §6.7.3 especifica el esquema de identificación de PDF/A en el espacio de nombres de AIIM. Indica que un archivo que no es conforme ni con PDF/A-4e ni con PDF/A-4f no proporciona ninguna entrada pdfa:conformance. NextPDF lo refleja exactamente en ConformanceMode::pdfaConformanceLetter(): PdfA4 devuelve la cadena vacía, PdfA4e devuelve E, PdfA4f devuelve F.

El límite crítico entre ediciones es el siguiente: la creación de archivos PDF/A-4 —el diccionario OutputIntent, el perfil ICC incrustado, el esquema de extensión XMP, las garantías sobre subconjuntos de fuentes y la prohibición de cifrado— está implementada en el PdfAManager de Enterprise. El PdfAManager de Enterprise se incluye en la extensión nextpdf/pro. En una instalación que solo incluye el núcleo, Document::enablePdfA() lanza InvalidConfigException porque la capacidad security.pdfa no está registrada. El ejemplo ejecutable (examples/32-pdfa4-icc.php) lo demuestra sondeando el registro de capacidades y mostrando un mensaje claro en lugar de un volcado de pila.

Por lo tanto, solo con el núcleo, la superficie de PDF/A-4 se limita únicamente al discriminador: NextPDF registra qué variante de PDF/A-4 declara un documento. NextPDF emite los marcadores pdfaid:part = 4 / pdfa:conformance definidos por el esquema. Producir un archivo PDF/A-4 completo —y validar que es conforme— son pasos distintos. El primer paso requiere nextpdf/pro. El segundo paso requiere veraPDF.

SuperficieEdiciónQué proporciona
ConformanceMode::PdfA4 / PdfA4e / PdfA4fcoreEl discriminador de variante
ConformanceMode::pdfaPart()4coreNúmero de parte de ISO 19005
ConformanceMode::pdfaConformanceLetter()'' / 'E' / 'F'coreLetra de conformidad del §6.7.3
ConformanceMode::requiresPdf17()falsecoreControl del linaje PDF 2.0
Document::enablePdfA()proCreación de OutputIntent + ICC + XMP; lanza InvalidConfigException en el núcleo
<?php
declare(strict_types=1);
use NextPDF\Conformance\ConformanceMode;
// Core: introspect the declared PDF/A-4f contract.
$mode = ConformanceMode::PdfA4f;
$mode->pdfaPart(); // 4
$mode->pdfaConformanceLetter(); // 'F' (ISO 19005-4:2020 §6.7.3 / Annex A)
$mode->requiresPdf17(); // false (PDF/A-4 is PDF 2.0 lineage)
<?php
declare(strict_types=1);
use NextPDF\Core\Document;
use NextPDF\Exception\InvalidConfigException;
use NextPDF\Support\CapabilityRegistry;
// PDF/A-4 file authoring requires the Premium extension. Probe first so a
// Core-only install gets a clear rationale, not a stack trace.
$registry = CapabilityRegistry::getInstance();
if (!$registry->get('security.pdfa')->isAvailable()) {
throw new InvalidConfigException(
configKey: 'security.pdfa',
givenValue: 'Core-only install',
expectedType: 'nextpdf/pro extension (Enterprise PdfAManager)',
);
}
$doc = Document::createStandalone();
$doc->enablePdfA(); // Emits OutputIntent + ICC + pdfaid XMP (Premium).
// … write content …
$doc->save(__DIR__ . '/out/archive-a4.pdf');
// The file now CARRIES PDF/A-4 structures. Conformance is still unproven
// until veraPDF asserts it:
//
// verapdf --flavour 4 out/archive-a4.pdf
  • El núcleo no puede crear un archivo PDF/A-4. enablePdfA() lanza una excepción en el núcleo. Solo el discriminador y los marcadores XMP forman parte de la superficie del núcleo.
  • El PDF/A-4 base no emite pdfa:conformance. Según ISO 19005-4:2020 §6.7.3, solo PDF/A-4e y PDF/A-4f establecen la letra. ConformanceMode::PdfA4 devuelve la cadena vacía por diseño.
  • Linaje PDF 2.0, no PDF 1.7. Un error común es reutilizar una canalización de PDF/A-3 y esperar %PDF-1.7. PDF/A-4 es PDF 2.0; requiresPdf17() devuelve false en todos los casos de PDF/A-4.
  • La validación de ICC es Premium. La validación de ICC del OutputIntent de ISO 19005-4:2020 §6.2.2 (número mágico acsp, tabla de etiquetas, punto blanco D50) es tarea del PdfAManager de Enterprise, no del núcleo.
  • La biblioteca no certifica el archivo. Establecer PdfA4f y emitir los marcadores no convierte la salida en un archivo PDF/A-4f válido. Ejecutar veraPDF.

La superficie de PDF/A-4 del núcleo es introspección pura de tipos de valor (despacho match de enum, O(1), sin asignación de memoria). La ruta de creación de Premium añade el OutputIntent y el paquete ICC durante la escritura. Su costo es el tamaño del perfil incrustado, gestionado dentro del presupuesto del escritor. La validación con veraPDF es un paso externo, no parte de la generación.

PDF/A-4 prohíbe el cifrado. El PdfAManager de Enterprise impone el invariante de prohibición de cifrado. El PdfAManager de Enterprise ordena este invariante con respecto a enablePdfA() para que el código llamador no pueda combinar accidentalmente AES-GCM con el modo de archivado. La protección anticipada del núcleo en HasSecurity::enablePdfA() rechaza la combinación no admitida antes de que se escriba ningún byte. Consultar el modelo de amenazas del proyecto para conocer el detalle de la canalización de archivado.

Esto es una asignación de funciones, no una declaración de conformidad.

Área de ISO 19005-4:2020CláusulaCobertura de NextPDFEstado
Esquema de identificación de variante§6.7.3ConformanceMode emite pdfaid:part = 4 y la letra pdfa:conformance correspondienteReivindicado (núcleo; cubierto por pruebas unitarias en tests/Unit/Conformance/)
Control de linaje PDF 2.0§6.7.3 / baserequiresPdf17() devuelve false en todos los casos de PDF/A-4Verificado (probado con pruebas unitarias)
OutputIntent + ICC incrustado§6.2.2Enterprise PdfAManager (nextpdf/pro)Solo Premium (no el núcleo)
Esquema de extensión XMP, subconjuntos de fuentes, prohibición de cifrado§6 / anexo A/BEnterprise PdfAManager (nextpdf/pro)Solo Premium (no el núcleo)
Determinación de conformidadCláusula 5No la realiza NextPDF — veraPDFSin cobertura explícita

La compatibilidad no es conformidad, y esta página separa ambas deliberadamente. (a) NextPDF Core emite las estructuras que ISO 19005-4:2020 §6.7.3 define para la identificación de variante; esto es implementación, evidenciada por tests/Unit/Conformance/ConformanceModePdfAVariantTest.php (que se supera). (b) Que un archivo sea conforme a PDF/A-4 es una aseveración aparte que solo un validador puede hacer, según ISO 19005-4:2020 cláusula 5. La cláusula 5 establece que la determinación efectiva de la conformidad la realiza una herramienta de comprobación frente a los requisitos normativos. NextPDF hace la afirmación (a). NextPDF no hace la afirmación (b). Validar con veraPDF (verapdf --flavour 4 …, o php oracle/run.php para el arnés del oráculo, que solo se ejecuta cuando el binario de veraPDF está presente, un control opcional).

Las frases «PDF/A-4 compliant», «fully conformant» y «PDF/A-4 certified» están deliberadamente ausentes de esta página. NextPDF emite estructuras relevantes para PDF/A-4; no garantiza un archivo conforme.

Las citas se han parafraseado a partir del corpus de cumplimiento de NextPDF. Los resúmenes reference_id completos de 64 caracteres se registran en el encabezado de la página y en docs/public/modules/core/_normative-evidence-conf.md.