Ir al contenido
getnextpdf.com

Pro edición

Cumplimiento — Referencia detallada

El módulo Compliance agrupa tres superficies independientes bajo NextPDF\Pro\Compliance:

  • Informe de etiquetas de idioma — una fachada de política estricta /Lang para PDF/UA-2 más un generador de informes de eventos de cumplimiento estructurado con forma PSR-3.
  • Gestión de facturación electrónica — validación Factur-X 1.08 / ZUGFeRD 2.4 frente al modelo semántico EN 16931 y emisión de PDF/A-3 híbrido.
  • Procedencia — incrustación y extracción de almacenes de manifiestos C2PA suministrados por el llamante mediante un analizador JUMBF reforzado contra ataques; la síntesis de reivindicaciones permanece restringida a vista previa.

El módulo informa de lo que comprueba. No certifica documentos ni realiza firma criptográfica.

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

No existe un indicador de licencia por función. Se trata de una capacidad de la edición Pro. El generador experimental de reivindicaciones C2PA requiere además una habilitación explícita por entorno (véase Casos límite y modos de fallo).

Ventana de terminal
composer require nextpdf/pro:^3
SímboloParámetrosComportamiento por defectoDevuelveLanza o falla conNotas
LangComplianceReporter::warn() / ::error()string $tag, string $reason, ?string $clauseReference = nullEmite un registro JSON estructurado por evento de etiqueta de idioma a través del logger PSR-3voidJsonException si el registro no se puede codificar en JSONwarn = rechazo en modo laxo; error = rechazo en modo estricto
LangComplianceReporter::reportException()InvalidBcp47TagException $exception, string $severity = 'error'Extrae la etiqueta y el motivo de la excepción; delega en warn() o error()voidComo arribaVía de conveniencia
LangComplianceReporter::buildRecord()string $severity, string $tag, string $reason, ?string $clauseReference = nullConstruye el arreglo del registro sin registrarloarrayNo lanzaPara sumideros personalizados como resúmenes JSON por archivo
ConformancePolicy::default()?LoggerInterface $logger = nullPolítica estricta UA-2: las etiquetas /Lang malformadas o no registradas se rechazanselfNo lanzaEl valor por defecto en v5.0 es estricto
ConformancePolicy::fromCore()CoreConformancePolicy $core, ?LoggerInterface $logger = nullEnvuelve una política Core existente tal cual; no invierte ningún ejeselfNo lanzaPrefiera default() para la postura estricta
ConformancePolicy::withStrictUa2()bool $enabledDevuelve una copia con el eje estricto establecido; desactivarlo emite un notice PSR-3selfNo lanzaExclusión obsoleta; objetivo de eliminación 6.0.0
ConformancePolicy::isStrictUa2() / ::mode()Lee la política Core subyacentebool / ConformanceModeNo lanza
EInvoiceValidator::validate()string $pdfPathCanalización completa: comprobación del envoltorio PDF/A-3, extracción de adjuntos, detección de perfil, reglas EN 16931, SchematronEInvoiceValidationResultSubclase de EInvoiceException en fallo de E/S, estructura PDF malformada o caída de la herramientaInterfaz SPI congelada; un PDF bien formado que no es factura electrónica devuelve un resultado, nunca lanza
EInvoiceXmlValidator::validate()string $xmlPayload, ValidatorContext $contextVerificación estructural previa más el corpus profundo de reglas semánticas EN 16931 sobre una carga CIIcontrato ValidationResultNo lanza ante entrada no válida; el rechazo aflora como un resultado fallido con hallazgosValidador concreto multinivel; entrada filtrada mediante XmlGuard
EInvoiceValidationResult::isValid()Verdadero solo cuando el envoltorio, la especificación del adjunto, el perfil y la sintaxis se cumplen y no existe ninguna infracción FATALboolNo lanzaUna lista de infracciones vacía por sí sola no equivale a validez
EInvoiceValidationResult::notAnEInvoice()Resultado determinista con todo nulo y todo falsoselfNo lanzaFábrica para el caso «no es una factura híbrida»
EInvoiceProfileenum respaldado por cadenaCasos MINIMUM, BASIC_WL, BASIC, EN16931, EXTENDED, respaldados por URN de BT-24isEn16931Conformant() es falso para MINIMUM y BASIC_WL
EInvoiceSyntaxenum respaldado por cadenaCasos UN_CEFACT_CII, UBL_INVOICE, UBL_CREDIT_NOTESolo CII es isFacturXEligible(); UBL es solo para validación
BusinessRuleViolationstring $ruleId, BusinessRuleSeverity $severity, string $message, ?string $xpath = null, ?string $ramPath = nullDTO de infracción inmutableFamilias de identificadores de regla BR-, BR-CO-, BR-CL-, BR-DEC-, BR-FXEXT-
BusinessRuleSeverityenum respaldado por cadenaFATAL invalida la factura; WARNING señala un problema de calidadRefleja los niveles de Schematron de EN 16931
FacturXEmbedder::embed()véase la firma en el bloqueAñade un flujo de archivo incrustado, filespec y XMP a un origen PDF/A; reescribe la xrefvoidEInvoiceException ante XML malformado, origen ilegible, catálogo ausente, origen con flujos de objetos o de xref, o fallo de escritura de salidaEl archivo de origen se deja intacto
FacturXEmbedderOptions::default()/AFRelationship /Alternative, nombre de archivo factur-x.xml, tipo INVOICE, versión 1.0selfNo lanzaLos valores por defecto satisfacen el mandato alemán y siguen siendo aceptados en Francia
FacturXEmbedderOptions::withRelationship() / ::withFilename()stringDevuelve una copia con la anulación aplicadaselfInvalidArgumentException fuera de los conjuntos de aceptaciónRelaciones: Source, Data, Alternative; los nombres de archivo incluyen zugferd-invoice.xml y xrechnung.xml
FacturXEmbedderOptions::withDocumentType()string $documentTypeDevuelve una copia con la anulación del tipo de documento XMPselfNo lanzaLos valores no se enumeran de forma defensiva
FacturXContractEmbedder::embed()string $pdfBytes, string $xmlPayload, EmbedderOptions $optionsAdaptador de bytes de entrada a bytes de salida sobre FacturXEmbedder mediante archivos temporales de vida cortastringEInvoiceException; el perfil XRECHNUNG se rechaza por ser exclusivo de EnterpriseImplementación multinivel de EmbedderInterface
C2paManifestEmbedder::embed()string $pdfBytes, ManifestStore $storeIncrusta la serialización en bytes del almacén en la ubicación del perfilstringC2paException ante cualquier fallo de incrustaciónInterfaz SPI congelada; solo bytes, sin E/S
C2paManifestEmbedder::extract()string $pdfBytesAnaliza un almacén incrustado mediante el analizador JUMBF reforzadoManifestStore|nullSubclase de C2paException cuando hay un almacén presente pero incumple un tope de refuerzoNull indica ausencia; la ausencia nunca lanza
ManifestStore::fromBoxes() / ::empty()list<JumbfBox> / —Construye el objeto de valor inmutable del almacénselfNo lanzaEl orden de las cajas es determinante para la igualdad de ida y vuelta
ManifestStore::toBytes() / ::isEmpty() / ::size()Serializa las cajas raíz; un almacén vacío se serializa como cadena vacíastring / bool / intNo lanza
JumbfBoxParser::parse()string $bytesAnaliza las cajas JUMBF de nivel raíz bajo topes estrictoslist<JumbfBox>MalformedJumbfException, JumbfBombException, JumbfCycleDetectedException, JumbfDepthExceededExceptionTopes: profundidad 8, 64 MiB por caja, 128 MiB en total, MAX_CHILDREN_PER_SUPERBOX 4096
JumbfBox::superbox() / ::leaf()string $tbox, …Construye una caja validada; toBytes() realiza el ciclo de ida y vuelta a través del analizadorselfMalformedJumbfException cuando el TBox no tiene exactamente 4 bytes
C2paCapabilityStatus::current() / ::summary()Informa de la madurez de la capacidad C2PA, actualmente preview-draftself / stringNo lanzaMarcador de vista previa verificable por máquina
Feature::PREVIEW_C2PA_DRAFT->isEnabled()Lee el entorno del proceso en cada llamada; solo el literal '1' la habilitaboolNo lanzaVariable de entorno NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT
ExperimentalC2paEmbedder::buildManifestStore()string $sourceBytes, string $producerConstruye un almacén de manifiestos fijado a borrador con una aserción de reivindicación de vinculación de hash SHA-256ManifestStoreEl constructor lanza LogicException cuando el indicador de vista previa está desactivadoVista previa; formato de transmisión fijado a una instantánea de borrador; no se emite firma de reivindicación

Firmas de los puntos de entrada, textualmente:

public static function default(?LoggerInterface $logger = null): self
public function withStrictUa2(bool $enabled): self
public function isStrictUa2(): bool
public function validate(string $pdfPath): EInvoiceValidationResult
public function embed(
string $sourcePdfPath,
string $xml,
EInvoiceProfile $profile,
string $outputPdfPath,
?FacturXEmbedderOptions $options = null,
): void
public function embed(string $pdfBytes, ManifestStore $store): string
public function extract(string $pdfBytes): ?ManifestStore

Informe de etiquetas de idioma. LangComplianceReporter emite un registro JSON estructurado por cada evento de etiqueta de idioma de PDF/UA-2. Cada registro lleva el discriminador de evento fijo, una severidad (warn para un rechazo en modo laxo, error para un rechazo en modo estricto), la etiqueta infractora textualmente, un motivo legible por máquina, los componentes de la etiqueta analizada (o null cuando la etiqueta no supera la gramática de forma de RFC 5646), una referencia de cláusula ISO 14289-2 §8.4.4 y una marca de tiempo UTC con microsegundos. El JSON viaja como cuerpo del mensaje PSR-3; los sumideros posteriores analizan el campo del mensaje directamente. ConformancePolicy es la fachada Premium sobre la política de conformidad Core. Su valor por defecto aplica una gestión estricta del idioma UA-2 y rechaza una etiqueta malformada o no registrada que llegue a /Lang. El auxiliar de exclusión withStrictUa2(false) revierte al comportamiento laxo heredado y registra un notice PSR-3 cuando el valor efectivo realmente cambia. NextPDF marca ese auxiliar como obsoleto desde v5.0 con objetivo de eliminación 6.0.0. Para migrar: audite el corpus en busca de valores /Lang malformados con composer pdfua2:audit-lang-tags <pdf-or-dir>, corríjalos y luego elimine la llamada de exclusión.

Gestión de facturación electrónica. EInvoiceValidator es el contrato SPI congelado para la validación de PDF híbrido: comprobación del envoltorio PDF/A-3, extracción de adjuntos /AF, detección de perfil a partir del identificador de especificación BT-24, el motor de reglas de negocio EN 16931 y una pasada de Schematron. Un PDF bien formado que no es Factur-X devuelve EInvoiceValidationResult::notAnEInvoice() en lugar de lanzar; solo los fallos de E/S, la estructura PDF malformada o las caídas de la herramienta generan una subclase de EInvoiceException. EInvoiceXmlValidator es el validador XML concreto multinivel: filtra la entrada mediante el XmlGuard de Core, ejecuta la verificación estructural previa y el corpus profundo de reglas semánticas EN 16931, y falla de forma cerrada — los errores del motor afloran como hallazgos de error, nunca como aprobaciones silenciosas. FacturXEmbedder transforma un origen PDF/A en un PDF/A-3 híbrido: añade un flujo de archivo incrustado, un filespec con un /AFRelationship configurable y un paquete de extensión XMP de Factur-X, y luego reescribe la tabla de referencias cruzadas clásica. Tanto el arreglo /AF del catálogo como el árbol de nombres /Names /EmbeddedFiles referencian el adjunto, de modo que los lectores ZUGFeRD heredados lo resuelven.

Procedencia. C2paManifestEmbedder incrusta un almacén de manifiestos C2PA suministrado por el llamante en una cadena de bytes PDF, o extrae uno. ManifestStore es el objeto de valor inmutable que cruza el límite. La costura es solo de bytes y neutral respecto al proveedor: no sintetiza reivindicaciones, no ingiere referencias URI ni resuelve vinculaciones de hash, y no realiza ninguna E/S de red ni de sistema de archivos. extract() devuelve null ante una ausencia y es barato en PDF sin almacén. Toda extracción no nula ya ha superado los topes de refuerzo de JumbfBoxParser.

Este módulo informa de lo que comprueba. No certifica un documento, no lo hace jurídicamente vinculante ni garantiza que ninguna salida satisfaga una regulación. El validador de facturación electrónica no es un validador de autoridad tributaria y excluye las extensiones nacionales (por ejemplo, el SDI italiano, el Chorus Pro francés, el XRechnung alemán). Como establece EN 16931-1, el emisor de la factura sigue siendo responsable de cumplir las reglas de la legislación pertinente. La compatibilidad con un estándar no es conformidad con él. Consulte a su equipo de cumplimiento para determinar la suficiencia regulatoria.

  • Un PDF bien formado que no es Factur-X devuelve un resultado «no es una factura electrónica»; no lanza.
  • Una lista de infracciones de reglas de negocio vacía no significa por sí sola que el documento sea válido; también se aplican las comprobaciones de envoltorio y de adjunto.
  • FacturXEmbedder falla de forma cerrada ante orígenes que usan flujos de objetos comprimidos (/Type /ObjStm) o flujos de referencias cruzadas (/Type /XRef, híbrido /XRefStm). Vuelva a guardar tales orígenes con una tabla de referencias cruzadas clásica primero.
  • Las cargas XML se filtran mediante el XmlGuard de Core: las declaraciones DOCTYPE o de entidad, la entrada sobredimensionada y el UTF-8 no válido se rechazan con una EInvoiceException en la vía de incrustación, o con un resultado fallido en la vía del validador.
  • FacturXContractEmbedder rechaza el perfil XRECHNUNG de forma explícita en lugar de degradarlo silenciosamente; la emisión de XRechnung es una capacidad de Enterprise.
  • C2paManifestEmbedder::extract() distingue la ausencia (null) de la malformación (subclase de C2paException que nombra la invariante incumplida: estructura malformada, bomba de tamaño o de recuento, ciclo de desplazamientos, profundidad de anidamiento).
  • La construcción de ExperimentalC2paEmbedder lanza una LogicException a menos que el indicador de entorno de vista previa sea igual a '1'. Su formato de transmisión está fijado a una instantánea de borrador de C2PA y puede cambiar sin previo aviso; no emite firma de reivindicación. Esta capacidad permanece en vista previa hasta que el perfil PDF de C2PA se congele.
  • La exclusión laxa de UA-2 estricta está obsoleta; migre al valor por defecto estricto (véase Contrato de comportamiento).
  • Este módulo no realiza firma criptográfica. La firma de reivindicaciones C2PA y la custodia de claves quedan fuera del alcance; véase el módulo Security para el comportamiento de firma en modo FIPS.
ComportamientoReferenciaEstado
Declaración del idioma natural (/Lang)ISO 14289-2:2024 §8.4.4Comprobado / informado
Modelo semántico central de facturaEN 16931-1:2026Comprobado (el emisor sigue siendo responsable)
Archivos asociados / flujos de archivo incrustadosISO 32000-2:2020 §14.13.2Emitido (/AF, /EF, /Params)
Reglas de relación de adjunto y de contenedorFactur-X 1.08 §3.1, §6.2Emitido / comprobado (por defecto /AFRelationship /Alternative)
Almacén de manifiestos C2PA / JUMBFC2PA 2.1 §11.1Incrustación / extracción admitidas; síntesis de reivindicaciones en vista previa

Esto registra las especificaciones frente a las cuales se construye el módulo y lo que comprueba o emite. No es una declaración de certificación ni de suficiencia regulatoria. NextPDF no posee ninguna certificación para estos estándares.

  • La forma del registro del generador de informes es un contrato estable; las reglas de alertado posteriores pueden fijarse contra el discriminador de evento fijo.
  • Desactivar UA-2 estricto emite un aviso de obsolescencia visible en la telemetría solo cuando el valor efectivo cambia; reafirmar el valor actual es silencioso.
  • El incrustador de Factur-X conserva los bytes de origen textualmente y añade objetos nuevos; procura preservar la conformidad PDF/A-3 pero no revalida. Canalice la salida a través de un validador PDF/A externo para una atestación firme.
  • La costura C2PA congela cinco invariantes: sin importaciones de terceros, contrato solo de bytes, sin E/S, extracción con null ante ausencia y sin síntesis de reivindicaciones en la capa estable.
  • Los topes de JumbfBoxParser son constantes públicas; dimensione las entradas que acepta frente a ellos en lugar de rederivar límites.

Esta página documenta únicamente el comportamiento observable externamente y la superficie pública admitida de la API. Las rutas de espacios de nombres internas, las clases auxiliares, las tablas de mecanismos, los nombres de archivo de runbook y los prefijos de tíquets quedan fuera del alcance.