Pro edición
Cumplimiento — Referencia detallada
Panorama general
Sección titulada «Panorama general»El módulo Compliance agrupa tres superficies independientes bajo NextPDF\Pro\Compliance:
- Informe de etiquetas de idioma — una fachada de política estricta
/Langpara 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.
Disponibilidad y licencias
Sección titulada «Disponibilidad y licencias»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).
Superficie pública de la API
Sección titulada «Superficie pública de la API»composer require nextpdf/pro:^3| Símbolo | Parámetros | Comportamiento por defecto | Devuelve | Lanza o falla con | Notas |
|---|---|---|---|---|---|
LangComplianceReporter::warn() / ::error() | string $tag, string $reason, ?string $clauseReference = null | Emite un registro JSON estructurado por evento de etiqueta de idioma a través del logger PSR-3 | void | JsonException si el registro no se puede codificar en JSON | warn = 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() | void | Como arriba | Vía de conveniencia |
LangComplianceReporter::buildRecord() | string $severity, string $tag, string $reason, ?string $clauseReference = null | Construye el arreglo del registro sin registrarlo | array | No lanza | Para sumideros personalizados como resúmenes JSON por archivo |
ConformancePolicy::default() | ?LoggerInterface $logger = null | Política estricta UA-2: las etiquetas /Lang malformadas o no registradas se rechazan | self | No lanza | El valor por defecto en v5.0 es estricto |
ConformancePolicy::fromCore() | CoreConformancePolicy $core, ?LoggerInterface $logger = null | Envuelve una política Core existente tal cual; no invierte ningún eje | self | No lanza | Prefiera default() para la postura estricta |
ConformancePolicy::withStrictUa2() | bool $enabled | Devuelve una copia con el eje estricto establecido; desactivarlo emite un notice PSR-3 | self | No lanza | Exclusión obsoleta; objetivo de eliminación 6.0.0 |
ConformancePolicy::isStrictUa2() / ::mode() | — | Lee la política Core subyacente | bool / ConformanceMode | No lanza | — |
EInvoiceValidator::validate() | string $pdfPath | Canalización completa: comprobación del envoltorio PDF/A-3, extracción de adjuntos, detección de perfil, reglas EN 16931, Schematron | EInvoiceValidationResult | Subclase de EInvoiceException en fallo de E/S, estructura PDF malformada o caída de la herramienta | Interfaz SPI congelada; un PDF bien formado que no es factura electrónica devuelve un resultado, nunca lanza |
EInvoiceXmlValidator::validate() | string $xmlPayload, ValidatorContext $context | Verificación estructural previa más el corpus profundo de reglas semánticas EN 16931 sobre una carga CII | contrato ValidationResult | No lanza ante entrada no válida; el rechazo aflora como un resultado fallido con hallazgos | Validador 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 FATAL | bool | No lanza | Una lista de infracciones vacía por sí sola no equivale a validez |
EInvoiceValidationResult::notAnEInvoice() | — | Resultado determinista con todo nulo y todo falso | self | No lanza | Fábrica para el caso «no es una factura híbrida» |
EInvoiceProfile | enum respaldado por cadena | Casos MINIMUM, BASIC_WL, BASIC, EN16931, EXTENDED, respaldados por URN de BT-24 | — | — | isEn16931Conformant() es falso para MINIMUM y BASIC_WL |
EInvoiceSyntax | enum respaldado por cadena | Casos UN_CEFACT_CII, UBL_INVOICE, UBL_CREDIT_NOTE | — | — | Solo CII es isFacturXEligible(); UBL es solo para validación |
BusinessRuleViolation | string $ruleId, BusinessRuleSeverity $severity, string $message, ?string $xpath = null, ?string $ramPath = null | DTO de infracción inmutable | — | — | Familias de identificadores de regla BR-, BR-CO-, BR-CL-, BR-DEC-, BR-FXEXT- |
BusinessRuleSeverity | enum respaldado por cadena | FATAL invalida la factura; WARNING señala un problema de calidad | — | — | Refleja los niveles de Schematron de EN 16931 |
FacturXEmbedder::embed() | véase la firma en el bloque | Añade un flujo de archivo incrustado, filespec y XMP a un origen PDF/A; reescribe la xref | void | EInvoiceException ante XML malformado, origen ilegible, catálogo ausente, origen con flujos de objetos o de xref, o fallo de escritura de salida | El archivo de origen se deja intacto |
FacturXEmbedderOptions::default() | — | /AFRelationship /Alternative, nombre de archivo factur-x.xml, tipo INVOICE, versión 1.0 | self | No lanza | Los valores por defecto satisfacen el mandato alemán y siguen siendo aceptados en Francia |
FacturXEmbedderOptions::withRelationship() / ::withFilename() | string | Devuelve una copia con la anulación aplicada | self | InvalidArgumentException fuera de los conjuntos de aceptación | Relaciones: Source, Data, Alternative; los nombres de archivo incluyen zugferd-invoice.xml y xrechnung.xml |
FacturXEmbedderOptions::withDocumentType() | string $documentType | Devuelve una copia con la anulación del tipo de documento XMP | self | No lanza | Los valores no se enumeran de forma defensiva |
FacturXContractEmbedder::embed() | string $pdfBytes, string $xmlPayload, EmbedderOptions $options | Adaptador de bytes de entrada a bytes de salida sobre FacturXEmbedder mediante archivos temporales de vida corta | string | EInvoiceException; el perfil XRECHNUNG se rechaza por ser exclusivo de Enterprise | Implementación multinivel de EmbedderInterface |
C2paManifestEmbedder::embed() | string $pdfBytes, ManifestStore $store | Incrusta la serialización en bytes del almacén en la ubicación del perfil | string | C2paException ante cualquier fallo de incrustación | Interfaz SPI congelada; solo bytes, sin E/S |
C2paManifestEmbedder::extract() | string $pdfBytes | Analiza un almacén incrustado mediante el analizador JUMBF reforzado | ManifestStore|null | Subclase de C2paException cuando hay un almacén presente pero incumple un tope de refuerzo | Null indica ausencia; la ausencia nunca lanza |
ManifestStore::fromBoxes() / ::empty() | list<JumbfBox> / — | Construye el objeto de valor inmutable del almacén | self | No lanza | El 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ía | string / bool / int | No lanza | — |
JumbfBoxParser::parse() | string $bytes | Analiza las cajas JUMBF de nivel raíz bajo topes estrictos | list<JumbfBox> | MalformedJumbfException, JumbfBombException, JumbfCycleDetectedException, JumbfDepthExceededException | Topes: 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 analizador | self | MalformedJumbfException cuando el TBox no tiene exactamente 4 bytes | — |
C2paCapabilityStatus::current() / ::summary() | — | Informa de la madurez de la capacidad C2PA, actualmente preview-draft | self / string | No lanza | Marcador 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 habilita | bool | No lanza | Variable de entorno NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT |
ExperimentalC2paEmbedder::buildManifestStore() | string $sourceBytes, string $producer | Construye un almacén de manifiestos fijado a borrador con una aserción de reivindicación de vinculación de hash SHA-256 | ManifestStore | El constructor lanza LogicException cuando el indicador de vista previa está desactivado | Vista 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): selfpublic function withStrictUa2(bool $enabled): selfpublic function isStrictUa2(): boolpublic function validate(string $pdfPath): EInvoiceValidationResultpublic function embed( string $sourcePdfPath, string $xml, EInvoiceProfile $profile, string $outputPdfPath, ?FacturXEmbedderOptions $options = null,): voidpublic function embed(string $pdfBytes, ManifestStore $store): stringpublic function extract(string $pdfBytes): ?ManifestStoreContrato de comportamiento
Sección titulada «Contrato de comportamiento»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.
Casos límite y modos de fallo
Sección titulada «Casos límite y modos de fallo»- 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.
FacturXEmbedderfalla 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
XmlGuardde Core: las declaraciones DOCTYPE o de entidad, la entrada sobredimensionada y el UTF-8 no válido se rechazan con unaEInvoiceExceptionen la vía de incrustación, o con un resultado fallido en la vía del validador. FacturXContractEmbedderrechaza el perfilXRECHNUNGde 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 deC2paExceptionque nombra la invariante incumplida: estructura malformada, bomba de tamaño o de recuento, ciclo de desplazamientos, profundidad de anidamiento).- La construcción de
ExperimentalC2paEmbedderlanza unaLogicExceptiona 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.
Conformidad
Sección titulada «Conformidad»| Comportamiento | Referencia | Estado |
|---|---|---|
Declaración del idioma natural (/Lang) | ISO 14289-2:2024 §8.4.4 | Comprobado / informado |
| Modelo semántico central de factura | EN 16931-1:2026 | Comprobado (el emisor sigue siendo responsable) |
| Archivos asociados / flujos de archivo incrustados | ISO 32000-2:2020 §14.13.2 | Emitido (/AF, /EF, /Params) |
| Reglas de relación de adjunto y de contenedor | Factur-X 1.08 §3.1, §6.2 | Emitido / comprobado (por defecto /AFRelationship /Alternative) |
| Almacén de manifiestos C2PA / JUMBF | C2PA 2.1 §11.1 | Incrustació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.
Notas de desarrollo
Sección titulada «Notas de desarrollo»- 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
JumbfBoxParserson constantes públicas; dimensione las entradas que acepta frente a ellos en lugar de rederivar límites.
Límite de publicación
Sección titulada «Límite de publicación»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.