Ir al contenido
getnextpdf.com

Enterprise edición

Cumplimiento — Referencia detallada

El módulo Compliance dirige un PDF terminado a un sidecar de validación externo y devuelve un único resultado normalizado. ComplianceGateway resuelve el sidecar responsable a partir de un ComplianceProfile, aplica una política de disponibilidad de cierre seguro y envuelve cada veredicto de herramienta en un ExternalValidationResult. Se distribuyen puentes para veraPDF (PDF/A, PDF/UA, PDF 2.0 Arlington), EU DSS (niveles PAdES), el sidecar combinado Mustang/KoSIT (ZUGFeRD, Factur-X, EN 16931) y un daemon KoSIT independiente. El módulo también proporciona el sellado de preparación de AiReadyCertifier y un ejecutor para el conjunto de pruebas oficial KoSIT XRechnung.

Esta capacidad se distribuye en NextPDF Enterprise (nextpdf/enterprise) y se activa con un envoltorio de licencia de nivel Enterprise. Un despliegue sin ese derecho de uso no carga las clases de la capacidad. Comparar ediciones y obtener una licencia.

La superficie de Compliance/Evidence está licenciada por la capacidad enterprise.compliance.evidence. Un derecho de uso ausente o caducado deniega la función; no degrada el comportamiento de forma silenciosa.

NivelSuperficie de Compliance
CoreComprobaciones de flujo de bytes y de gramática en proceso; sin delegación en sidecar externo.
ProValidación EN 16931 / Factur-X / ZUGFeRD en proceso; sin sidecar externo.
EnterprisePuerta de enlace de validadores externos (este módulo) con un resultado unificado y una política de cierre seguro.

El validador de facturas electrónicas en proceso de Pro y el sidecar externo ZUGFeRD de Enterprise son superficies distintas. La puerta de enlace de validadores externos se distribuye únicamente en el paquete nextpdf/enterprise.

Ventana de terminal
composer require nextpdf/enterprise:^3
SímboloParámetrosComportamiento por defectoDevuelveLanza o falla conNotas
ComplianceGateway::__constructlist<ExternalValidator> $validators, LoggerInterface $logger, bool $optional = falseIndexa los validadores por nombre de herramientaEl modo opcional degrada la comprobación de disponibilidad a solo advertencia
ComplianceGateway::validatestring $pdfContent, ComplianceProfile $profile, array $options = []Resuelve el validador mediante ComplianceProfile::toolName(), comprueba la disponibilidad, delega?ExternalValidationResultComplianceSidecarUnavailableException; InvalidArgumentException (ningún validador registrado para la herramienta)Devuelve null únicamente en modo opcional con el sidecar caído
ComplianceGateway::validateAllProfilesstring $pdfContent, string $toolNameValida cada perfil asignado a la herramientalist<ExternalValidationResult>Igual que validate()Omite los resultados null (de modo opcional)
ComplianceGateway::healthCheckSondea el punto de conexión de estado de cada sidecar registradoarray<string, bool>Informa de la accesibilidad; no valida ningún documento
ComplianceGateway::buildComplianceMatrix (estático)list<ExternalValidationResult> $results, string $commitShaReduce los resultados a una matriz con versión de esquemaarray<string, mixed>Versión de esquema 1.0; registra la salida de la herramienta, no afirma nada
ComplianceProfile (enum)15 casos respaldados por cadenaAsigna cada perfil a una etiqueta de norma y a una herramientastandardReference(): string, toolName(): string
ExternalValidator (interfaz)Contrato de puente de sidecar sobre PSR-18validate() lanza ComplianceSidecarUnavailableException ante un fallo de transportegetToolName(), isAvailable(), validate()
VeraPdfValidator::validateFirma de la interfazPOST multipart al sidecar REST de veraPDF; análisis del informe JSONExternalValidationResultComplianceSidecarUnavailableException; InvalidArgumentException (perfil no compatible)PDF/A, PDF/UA, Arlington; analiza solo JSON, nunca XML
DssValidator::validateFirma de la interfazPOST JSON en Base64 al sidecar REST de EU DSSExternalValidationResultComplianceSidecarUnavailableException; InvalidArgumentException (perfil no compatible)PAdES B-B hasta B-LTA; el constructor rechaza tiempos de espera inferiores a un segundo
ZugferdExternalValidator::validateFirma de la interfazPOST multipart al sidecar combinado Mustang/KoSITExternalValidationResultComplianceSidecarUnavailableException (también con un cortacircuitos abierto); InvalidArgumentException (perfil no compatible)ZUGFeRD 2.4, Factur-X 1.08, EN 16931; cortacircuitos inyectado opcional
KoSitValidator::validateFirma de la interfazPOST de XML sin procesar a un daemon KoSIT independienteExternalValidationResultComplianceSidecarUnavailableException; InvalidArgumentException (perfil no compatible)Solo EN 16931; analiza el informe SVRL de Schematron con cierre seguro
ExternalValidationResultObjeto de valor de solo lecturaVeredicto de herramienta normalizadopasses(), fails(), nonConformanceCount(), toComplianceMatrix()
NonConformanceObjeto de valor de solo lecturaHallazgo único con id de regla, cláusula, gravedad y ubicacióntoArray()
ComplianceSidecarUnavailableExceptionstring $toolName, string $endpoint, int $code = 0, ?Throwable $previous = nullSeñal de indisponibilidad de sidecar con cierre segurotoolName y endpoint públicos de solo lectura
AiReadyCertifier::certifystring $pdfBytesEvalúa tres criterios de preparación; sella la procedencia XMParray{0: AiReadyCertification, 1: string}InvalidArgumentException (el sellado requiere una tabla de referencias cruzadas clásica)El segundo elemento es igual a la entrada cuando el nivel es not_certified
AiReadyCertificationObjeto de valor de solo lecturaEvaluación de preparación con nivel, recuento de criterios, incidencias y hash de origenEtiqueta de preparación interna, no una certificación de normas
XRechnungTestSuiteRunner::__constructstring $suitePath, ExternalValidator $validator, bool $useCuratedNegativeFallback = trueResuelve el directorio del conjunto extraídoInvalidArgumentException (el directorio no existe)Apunta al conjunto de pruebas oficial KoSIT XRechnung
XRechnungTestSuiteRunner::runbool $stopOnFirstFailure = falseValida cada instancia del conjunto a través del puenteXRechnungTestSuiteResultXRechnungTestSuiteException (validador no disponible; sin archivos XML)También isAvailable(), getSuitePath(), discoverTestFiles()
XRechnungTestSuiteResultObjeto de valor de solo lecturaResultado agregado del conjuntoallPassed(), totalCount(), getFailures(), getErrors(), toSummary()
XRechnungTestCaseResultObjeto de valor de solo lecturaResultado por casopassed(), hasError(), getFilename()
XRechnungTestSuiteExceptionConstructores estáticosSeñal de fallo en ejecución del conjuntoselfvalidatorUnavailable(), noTestFilesFound(string $suitePath)
namespace NextPDF\Enterprise\Compliance;
final class ComplianceGateway
{
/** @param list<ExternalValidator> $validators */
public function __construct(
array $validators,
private readonly LoggerInterface $logger,
private readonly bool $optional = false,
);
/** @param array<string, mixed> $options */
public function validate(
string $pdfContent,
ComplianceProfile $profile,
array $options = [],
): ?ExternalValidationResult;
/** @return list<ExternalValidationResult> */
public function validateAllProfiles(string $pdfContent, string $toolName): array;
/** @return array<string, bool> */
public function healthCheck(): array;
/**
* @param list<ExternalValidationResult> $results
* @return array<string, mixed>
*/
public static function buildComplianceMatrix(array $results, string $commitSha): array;
}
interface ExternalValidator
{
public function getToolName(): string;
public function isAvailable(): bool;
/** @param array<string, mixed> $options */
public function validate(
string $pdfContent,
ComplianceProfile $profile,
array $options = [],
): ExternalValidationResult;
}
enum ComplianceProfile: string
{
case PdfA1b = 'pdfa-1b';
// PdfA2b, PdfA3b, PdfA4, PdfA4f, PdfUa1, PdfUa2, Pdf20Arlington,
// PadesBasic, PadesTimestamp, PadesLongTerm, PadesArchive,
// Zugferd24, FacturX108, En16931
public function standardReference(): string;
public function toolName(): string;
}
final class AiReadyCertifier
{
/** @return array{0: AiReadyCertification, 1: string} Tuple of [certification, stamped PDF bytes] */
public function certify(string $pdfBytes): array;
}

ComplianceGateway::validate() resuelve el ExternalValidator registrado cuyo getToolName() coincide con ComplianceProfile::toolName(), comprueba isAvailable(), delega y devuelve un ExternalValidationResult normalizado. Reglas observables desde el exterior:

  • Cierre seguro por defecto. Cuando el sidecar resuelto no está disponible y el modo opcional está desactivado, la llamada lanza ComplianceSidecarUnavailableException. El documento no se comprueba; nunca se trata como aprobado.
  • Modo opcional. Construir la puerta de enlace con optional: true (los operadores lo conectan desde la variable de entorno NEXTPDF_COMPLIANCE_OPTIONAL) degrada un sidecar no disponible a una advertencia registrada y un retorno null. Quien llama debe tratar null como «no comprobado». El modo opcional cubre únicamente el sondeo previo de disponibilidad; un fallo de transporte durante la propia llamada de validación lanza ComplianceSidecarUnavailableException en ambos modos.
  • Perfil desconocido. Un perfil sin validador registrado lanza InvalidArgumentException; nunca aprueba de forma silenciosa.
  • Semántica de aprobación. ExternalValidationResult::passes() requiere que conformant sea verdadero y cero no conformidades. Cada resultado lleva el perfil, el nombre y la versión de la herramienta, el recuento de aserciones, los hallazgos, el SHA-256 de los bytes validados, una marca de tiempo UTC y la duración de la llamada.
  • La matriz es un registro, no una afirmación. buildComplianceMatrix() es un reductor estático que produce una estructura con versión de esquema, con las versiones de las herramientas y un SHA de commit para la trazabilidad. Registra la salida de la herramienta; no afirma nada.
  • Flujo de datos. El flujo de bytes completo del PDF se transmite al sidecar configurado a través de un cliente PSR-18. Cada validación se registra mediante PSR-3 con el perfil, la herramienta, aprobado/fallido, el recuento de aserciones y la duración.

Enrutamiento de perfil a herramienta, tal como lo devuelven ComplianceProfile::standardReference() y ::toolName():

Casos de perfilReferencia de normaHerramienta
pdfa-1b, pdfa-2b, pdfa-3b, pdfa-4, pdfa-4fISO 19005-1/-2/-3/-4 (Nivel B; Nivel F para 4f)veraPDF
pdfua-1, pdfua-2ISO 14289-1:2014, ISO 14289-2:2024veraPDF
pdf20-arlingtonISO 32000-2:2020 (modelo Arlington)veraPDF
pades-b-b, pades-b-t, pades-b-lt, pades-b-ltaETSI EN 319 142-1 B-B hasta B-LTAEU DSS
zugferd-2.4, factur-x-1.08, en-16931ZUGFeRD 2.4 / Factur-X 1.08 / EN 16931-1:2017Mustang/KoSIT

AiReadyCertifier::certify() evalúa tres criterios: la presencia estructural de firma, la salud de LTV y la ausencia de cifrado. Tres criterios superados producen el nivel certified; uno o dos producen partial; cero produce not_certified. En certified o partial, añade una actualización incremental que lleva un flujo de procedencia XMP y una anulación de Catalog; los bytes originales nunca se modifican. El nivel «certified» es una etiqueta de preparación interna de NextPDF, no una certificación de normas.

VeraPdfValidator analiza únicamente respuestas JSON del sidecar (sin XML; libre de XXE por construcción). KoSitValidator analiza el informe SVRL en XML del daemon con las declaraciones DOCTYPE rechazadas y el acceso de red desactivado, y trata un informe que no se puede analizar como un fallo de la llamada.

  • Un tiempo de espera del sidecar o un error de transporte se manifiesta como ComplianceSidecarUnavailableException desde el puente; aplica el cierre seguro por defecto.
  • Una respuesta del sidecar distinta de 200 produce un resultado fallido con un hallazgo específico de la herramienta (por ejemplo VERAPDF-HTTP-ERROR); nunca es una aprobación de conformidad.
  • Un cuerpo JSON o XML del sidecar mal formado es un fallo de validación de la llamada, no una aprobación de conformidad.
  • Los resultados de EU DSS sin firmas fallan con DSS-NO-SIGNATURES. Una indicación distinta de TOTAL_PASSED falla con DSS-SIG-INVALID. Un nivel de firma por debajo de la línea base esperada falla con DSS-LEVEL-MISMATCH.
  • DssValidator publica su presupuesto de tiempo de espera por solicitud en cada solicitud mediante la cabecera X-NextPDF-Timeout-Seconds; el cliente PSR-18 del integrador debe respetarlo para que un sidecar bloqueado no pueda retener el hilo llamante de forma ilimitada.
  • ZugferdExternalValidator opcionalmente enruta las llamadas al sidecar a través de un cortacircuitos inyectado; un cortacircuitos abierto se corresponde con ComplianceSidecarUnavailableException (fallo rápido, aun así con cierre seguro). El valor por defecto es un cortacircuitos sin operación.
  • KoSitValidator::isAvailable() acepta HTTP 200 y 405 del sondeo de estado del daemon; el daemon responde a GET con 405 cuando está en buen estado.
  • El sellado de AiReadyCertifier falla de forma segura con InvalidArgumentException cuando el documento original carece de una tabla de referencias cruzadas clásica (por ejemplo, flujos de referencias cruzadas).
  • XRechnungTestSuiteRunner::run() se niega a ejecutarse cuando el validador no está disponible o el conjunto no contiene archivos XML; con useCuratedNegativeFallback activado sustituye por un corpus negativo curado cuando el conjunto no incluye instancias no válidas.

Este módulo no realiza firma ni custodia de claves. La política de algoritmos en modo FIPS la gobiernan los módulos Security y Signature. La conformidad de firma se delega en EU DSS, que toma su propia determinación.

La puerta de enlace delega el veredicto de conformidad en una herramienta externa; el diseño refleja el propio límite de las normas según el cual la conformidad se determina frente a los requisitos, no la afirma un productor.

ComportamientoReferencia
Obligación del procesador conforme; la conformidad se determina frente a la normaISO 19005-4:2020 §5.2
Requisitos de archivo PDF/A-4 frente a la autoafirmación del productorISO 19005-4:2020 §6.6.4
La conformidad PDF/UA-2 es una propiedad del archivoISO 14289-2:2024 §6
Niveles de firma de referencia PAdESETSI EN 319 142-1 §5.4.3

La herramienta externa produce el veredicto. NextPDF no posee ninguna certificación y no concede ninguna; la compatibilidad con un perfil no es conformidad con él. Los resultados de validación son registros técnicos de comprobación de estructura a título de referencia, no asesoramiento jurídico; consulte a su equipo de cumplimiento para juzgar la suficiencia regulatoria.

  • El operador aloja y opera los sidecars, fija sus versiones, restringe su alcance de red, valida su TLS y controla el entorno que habilita el modo opcional. Los puntos de conexión del sidecar son un límite de confianza; los controles de residencia y retención de documentos, resultados y registros son responsabilidad del operador.
  • La salida de buildComplianceMatrix() está diseñada para la trazabilidad de CI: fije el SHA de commit y archive la matriz junto a los artefactos de compilación.
  • El ejecutor de XRechnung espera el conjunto de pruebas oficial extraído en un directorio local; el mensaje de su constructor indica la fuente de descarga pública.
  • El detalle del mecanismo interno permanece en la documentación interna del repositorio de origen y queda fuera del alcance de este manual.

Esta página documenta únicamente el comportamiento observable desde el exterior y la superficie de API pública compatible. Las rutas de espacio de nombres internas, las clases auxiliares, las tablas de mecanismos, los nombres de archivo de runbook y los prefijos de tickets quedan fuera del alcance.