Pro editie
Compliance — Diepe referentie
In één oogopslag
Sectie met titel “In één oogopslag”De Compliance-module bundelt drie onafhankelijke oppervlakken onder NextPDF\Pro\Compliance:
- Taaltag-rapportage — een strikte PDF/UA-2-
/Lang-beleidsfacade plus een gestructureerde, PSR-3-gevormde compliance-event-reporter. - E-invoice-afhandeling — Factur-X 1.08- / ZUGFeRD 2.4-validatie tegen het EN 16931-semantische model, en hybride PDF/A-3-emissie.
- Provenance — bed door de aanroeper geleverde C2PA-manifest-stores in en extraheer ze via een adversarieel-gehardende JUMBF-parser; claim-synthese blijft preview-gated.
De module rapporteert wat hij controleert. Het certificeert geen documenten en voert geen cryptografische ondertekening uit.
Beschikbaarheid en licenties
Sectie met titel “Beschikbaarheid en licenties”Deze capability wordt geleverd in NextPDF Pro (nextpdf/pro) en activeert met een Pro-tier-licentie-envelope. Een deployment zonder die entitlement laadt de klassen van de capability niet. Vergelijk edities en vraag een licentie aan.
Er bestaat geen licentievlag per functie. Dit is een Pro-editie-capability. De experimentele C2PA-claim-builder vereist daarnaast een expliciete omgevings-opt-in (zie Randgevallen en faalmodi).
Publiek API-oppervlak
Sectie met titel “Publiek API-oppervlak”composer require nextpdf/pro:^3| Symbool | Parameters | Standaardgedrag | Retourneert | Werpt of faalt met | Notities |
|---|---|---|---|---|---|
LangComplianceReporter::warn() / ::error() | string $tag, string $reason, ?string $clauseReference = null | Zendt één gestructureerde JSON-record per taaltag-gebeurtenis uit via de PSR-3-logger | void | JsonException als de record niet JSON-encodeerbaar is | warn = lax-mode-reject; error = strict-mode-reject |
LangComplianceReporter::reportException() | InvalidBcp47TagException $exception, string $severity = 'error' | Haalt tag en reden uit de exceptie; delegeert naar warn() of error() | void | Zoals hierboven | Gemakspad |
LangComplianceReporter::buildRecord() | string $severity, string $tag, string $reason, ?string $clauseReference = null | Bouwt de record-array zonder te loggen | array | Werpt niet | Voor eigen sinks zoals JSON-samenvattingen per bestand |
ConformancePolicy::default() | ?LoggerInterface $logger = null | Strikt UA-2-beleid: misvormde of niet-geregistreerde /Lang-tags worden afgewezen | self | Werpt niet | De v5.0-standaard is strikt |
ConformancePolicy::fromCore() | CoreConformancePolicy $core, ?LoggerInterface $logger = null | Wikkelt een bestaand Core-beleid ongewijzigd; geen assen omgezet | self | Werpt niet | Verkies default() voor de strikte houding |
ConformancePolicy::withStrictUa2() | bool $enabled | Retourneert een kopie met de strikte as gezet; uitschakelen zendt een PSR-3-notice uit | self | Werpt niet | Deprecated opt-out; verwijderdoel 6.0.0 |
ConformancePolicy::isStrictUa2() / ::mode() | — | Leest het onderliggende Core-beleid | bool / ConformanceMode | Werpt niet | — |
EInvoiceValidator::validate() | string $pdfPath | Volledige pijplijn: PDF/A-3-wrapper-controle, attachment-extractie, profieldetectie, EN 16931-regels, Schematron | EInvoiceValidationResult | EInvoiceException-subklasse bij I/O-fout, misvormde PDF-structuur of tooling-crash | Bevroren SPI-interface; een welgevormde niet-e-invoice-PDF retourneert een resultaat, werpt nooit |
EInvoiceXmlValidator::validate() | string $xmlPayload, ValidatorContext $context | Structurele pre-flight plus het EN 16931-diepsemantische regelcorpus over een CII-payload | contract ValidationResult | Werpt niet bij ongeldige invoer; afwijzing verschijnt als een gefaald resultaat met findings | Concrete cross-tier-validator; invoer gate’t via XmlGuard |
EInvoiceValidationResult::isValid() | — | Alleen true wanneer wrapper, attachment-spec, profiel en syntax kloppen en geen FATAL-overtreding bestaat | bool | Werpt niet | Een lege overtredingslijst alleen is geen geldigheid |
EInvoiceValidationResult::notAnEInvoice() | — | Deterministisch resultaat met alles-null, alles-false | self | Werpt niet | Factory voor het geval “geen hybride factuur” |
EInvoiceProfile | string-backed enum | Cases MINIMUM, BASIC_WL, BASIC, EN16931, EXTENDED, gebaseerd op BT-24-URN’s | — | — | isEn16931Conformant() is false voor MINIMUM en BASIC_WL |
EInvoiceSyntax | string-backed enum | Cases UN_CEFACT_CII, UBL_INVOICE, UBL_CREDIT_NOTE | — | — | Alleen CII is isFacturXEligible(); UBL is validator-only |
BusinessRuleViolation | string $ruleId, BusinessRuleSeverity $severity, string $message, ?string $xpath = null, ?string $ramPath = null | Onveranderlijke overtredings-DTO | — | — | Rule-id-families BR-, BR-CO-, BR-CL-, BR-DEC-, BR-FXEXT- |
BusinessRuleSeverity | string-backed enum | FATAL maakt de factuur ongeldig; WARNING markeert een kwaliteitszorg | — | — | Spiegelt de EN 16931-Schematron-niveaus |
FacturXEmbedder::embed() | zie signatuur-fence | Voegt een embedded-file-stream, filespec en XMP toe aan een PDF/A-bron; herschrijft de xref | void | EInvoiceException bij misvormde XML, onleesbare bron, ontbrekende catalog, object-stream- of xref-stream-bron, of schrijffout van de uitvoer | Het bronbestand blijft intact |
FacturXEmbedderOptions::default() | — | /AFRelationship /Alternative, bestandsnaam factur-x.xml, type INVOICE, versie 1.0 | self | Werpt niet | Standaarden voldoen aan het Duitse mandaat en blijven geaccepteerd in Frankrijk |
FacturXEmbedderOptions::withRelationship() / ::withFilename() | string | Retourneert een kopie met de override toegepast | self | InvalidArgumentException buiten de acceptatiesets | Relationships: Source, Data, Alternative; bestandsnamen omvatten zugferd-invoice.xml en xrechnung.xml |
FacturXEmbedderOptions::withDocumentType() | string $documentType | Retourneert een kopie met de XMP-document-type-override | self | Werpt niet | Waarden worden niet defensief opgesomd |
FacturXContractEmbedder::embed() | string $pdfBytes, string $xmlPayload, EmbedderOptions $options | Byte-in, byte-uit-adapter over FacturXEmbedder via kortlevende tijdelijke bestanden | string | EInvoiceException; het XRECHNUNG-profiel wordt afgewezen als Enterprise-only | Cross-tier-EmbedderInterface-implementatie |
C2paManifestEmbedder::embed() | string $pdfBytes, ManifestStore $store | Bedt de byte-serialisatie van de store in op de profiellocatie | string | C2paException bij elke embed-fout | Bevroren SPI-interface; alleen bytes, geen I/O |
C2paManifestEmbedder::extract() | string $pdfBytes | Parseert een ingebedde store via de gehardende JUMBF-parser | ManifestStore|null | C2paException-subklasse wanneer een store aanwezig is maar een hardening-cap overschrijdt | Null signaleert afwezigheid; afwezigheid werpt nooit |
ManifestStore::fromBoxes() / ::empty() | list<JumbfBox> / — | Bouwt het onveranderlijke store-value-object | self | Werpt niet | Box-volgorde is bepalend voor round-trip-gelijkheid |
ManifestStore::toBytes() / ::isEmpty() / ::size() | — | Serialiseert de root-boxes; een lege store serialiseert naar een lege string | string / bool / int | Werpt niet | — |
JumbfBoxParser::parse() | string $bytes | Parseert root-level-JUMBF-boxes onder harde caps | list<JumbfBox> | MalformedJumbfException, JumbfBombException, JumbfCycleDetectedException, JumbfDepthExceededException | Caps: diepte 8, 64 MiB per box, 128 MiB totaal, MAX_CHILDREN_PER_SUPERBOX 4096 |
JumbfBox::superbox() / ::leaf() | string $tbox, … | Bouwt een gevalideerde box; toBytes() round-trips via de parser | self | MalformedJumbfException wanneer de TBox niet precies 4 bytes is | — |
C2paCapabilityStatus::current() / ::summary() | — | Rapporteert de C2PA-capability-maturiteit, momenteel preview-draft | self / string | Werpt niet | Machine-checkbare preview-marker |
Feature::PREVIEW_C2PA_DRAFT->isEnabled() | — | Leest de proces-omgeving bij elke aanroep; alleen de letterlijke '1' schakelt in | bool | Werpt niet | Env-var NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT |
ExperimentalC2paEmbedder::buildManifestStore() | string $sourceBytes, string $producer | Bouwt een draft-gepinde manifest-store met één SHA-256-hash-binding-claim-assertion | ManifestStore | De constructor werpt LogicException wanneer de preview-vlag uit staat | Preview; wire-formaat gepind aan een draft-snapshot; geen claim-signature uitgezonden |
Entry-point-signaturen, verbatim:
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): ?ManifestStoreGedragscontract
Sectie met titel “Gedragscontract”Taaltag-rapportage. LangComplianceReporter zendt één gestructureerde JSON-record per PDF/UA-2-taaltag-gebeurtenis uit. Elke record draagt de vaste event-discriminator, een severity (warn voor een lax-mode-reject, error voor een strict-mode-reject), de overtredende tag verbatim, een machine-readable reden, de geparseerde tagcomponenten (of null wanneer de tag niet aan de RFC 5646-vormgrammatica voldoet), een ISO 14289-2 §8.4.4-clausulereferentie en een UTC-tijdstempel met microseconden. De JSON reist als de PSR-3-berichttekst; downstream-sinks parseren het message-veld direct. ConformancePolicy is de Premium-facade over het Core-conformance-beleid. De standaard past strikte UA-2-taalafhandeling toe en wijst een misvormde of niet-geregistreerde tag af die /Lang bereikt. De opt-out-helper withStrictUa2(false) keert terug naar het legacy lax-gedrag en logt een PSR-3-notice wanneer de effectieve waarde daadwerkelijk verandert. NextPDF markeert die helper als deprecated sinds v5.0 met verwijderdoel 6.0.0. Om te migreren: audit het corpus op misvormde /Lang-waarden met composer pdfua2:audit-lang-tags <pdf-or-dir>, corrigeer ze en laat dan de opt-out-aanroep vallen.
E-invoice-afhandeling. EInvoiceValidator is het bevroren SPI-contract voor hybride-PDF-validatie: PDF/A-3-wrapper-controle, /AF-attachment-extractie, profieldetectie uit de BT-24-specificatie-identifier, de EN 16931-business-rule-engine en een Schematron-pass. Een welgevormde niet-Factur-X-PDF retourneert EInvoiceValidationResult::notAnEInvoice() in plaats van te werpen; alleen I/O-fouten, misvormde PDF-structuur of tooling-crashes werpen een EInvoiceException-subklasse. EInvoiceXmlValidator is de concrete cross-tier-XML-validator: hij gate’t invoer via de Core-XmlGuard, draait structurele pre-flight en het diepe EN 16931-semantische regelcorpus, en faalt gesloten — engine-fouten verschijnen als error-findings, nooit als stille passes. FacturXEmbedder verbouwt een PDF/A-bron tot een hybride PDF/A-3: hij voegt een embedded-file-stream toe, een filespec met een configureerbare /AFRelationship, en een Factur-X-XMP-extensiepakket, en herschrijft vervolgens de klassieke cross-reference-tabel. Zowel de catalog-/AF-array als de /Names /EmbeddedFiles-name tree verwijzen naar de attachment, zodat legacy-ZUGFeRD-lezers hem oplossen.
Provenance. C2paManifestEmbedder bedt een door de aanroeper geleverde C2PA-manifest-store in een PDF-bytestring in, of extraheert er een. ManifestStore is het onveranderlijke value-object dat de grens overschrijdt. De seam is alleen-bytes en vendor-neutraal: het synthetiseert geen claims, ingest geen URI-referenties en lost geen hash-bindings op, en het voert geen netwerk- of filesystem-I/O uit. extract() retourneert null bij een miss en is goedkoop op PDF’s zonder store. Elke niet-null-extractie is de JumbfBoxParser-hardening-caps al gepasseerd.
Deze module rapporteert wat hij controleert. Het certificeert geen document, maakt het niet juridisch bindend en garandeert niet dat enige uitvoer aan een regelgeving voldoet. De e-invoice-validator is geen belastingautoriteit-validator en sluit nationale extensies uit (bijvoorbeeld Italiaanse SDI, Franse Chorus Pro, Duitse XRechnung). Zoals EN 16931-1 stelt, blijft de factuur-uitgever verantwoordelijk voor het naleven van de regels van relevante wetgeving. Ondersteuning voor een standaard is geen conformiteit ermee. Raadpleeg je complianceteam voor regelgevende toereikendheid.
Randgevallen en faalmodi
Sectie met titel “Randgevallen en faalmodi”- Een welgevormde niet-Factur-X-PDF retourneert een “not an e-invoice”-resultaat; het werpt niet.
- Een lege business-rule-violation-lijst betekent op zichzelf niet dat het document geldig is; wrapper- en attachment-controles gelden ook.
FacturXEmbedderfaalt gesloten op bronnen die gecomprimeerde object-streams (/Type /ObjStm) of cross-reference-streams (/Type /XRef, hybride/XRefStm) gebruiken. Sla zulke bronnen eerst opnieuw op met een klassieke cross-reference-tabel.- XML-payloads worden gegate via de Core-
XmlGuard: DOCTYPE- of entity-declaraties, te grote invoer en ongeldige UTF-8 worden afgewezen met eenEInvoiceExceptionop het embed-pad, of een gefaald resultaat op het validator-pad. FacturXContractEmbedderwijst hetXRECHNUNG-profiel luid af in plaats van het stil te downgraden; XRechnung-emissie is een Enterprise-capability.C2paManifestEmbedder::extract()onderscheidt afwezigheid (null) van misvorming (C2paException-subklasse die de geschonden invariant benoemt: misvormde structuur, size- of count-bomb, offset-cyclus, nesting-diepte).- Constructie van
ExperimentalC2paEmbedderwerpt eenLogicExceptiontenzij de preview-omgevingsvlag gelijk is aan'1'. Zijn wire-formaat is gepind aan een C2PA-draft-snapshot en kan zonder aankondiging veranderen; het zendt geen claim-signature uit. Deze capability blijft preview totdat het C2PA-PDF-profiel bevriest. - De strikte-UA-2-lax-opt-out is deprecated; migreer naar de strikte standaard (zie Gedragscontract).
- Deze module voert geen cryptografische ondertekening uit. C2PA-claim-ondertekening en sleutelbewaring vallen buiten de scope; zie de Security-module voor FIPS-modus-ondertekeningsgedrag.
Conformiteit
Sectie met titel “Conformiteit”| Gedrag | Referentie | Status |
|---|---|---|
Natuurlijke-taal-declaratie (/Lang) | ISO 14289-2:2024 §8.4.4 | Gecontroleerd / gerapporteerd |
| Core-factuur-semantisch model | EN 16931-1:2026 | Gecontroleerd (uitgever blijft verantwoordelijk) |
| Geassocieerde bestanden / embedded-file-streams | ISO 32000-2:2020 §14.13.2 | Uitgezonden (/AF, /EF, /Params) |
| Attachment-relatie en containerregels | Factur-X 1.08 §3.1, §6.2 | Uitgezonden / gecontroleerd (standaard /AFRelationship /Alternative) |
| C2PA-manifest-store / JUMBF | C2PA 2.1 §11.1 | Embed / extract ondersteund; claim-synthese preview |
Dit registreert de specificaties waartegen de module is gebouwd en wat hij controleert of uitzendt. Het is geen verklaring van certificering of regelgevende toereikendheid. NextPDF houdt geen certificering voor deze standaarden.
Ontwikkelnotities
Sectie met titel “Ontwikkelnotities”- De record-vorm van de reporter is een stabiel contract; downstream-alerting-regels mogen pinnen tegen de vaste event-discriminator.
- Het uitschakelen van strikte UA-2 zendt alleen een telemetrie-zichtbare deprecation-notice uit wanneer de effectieve waarde verandert; het opnieuw bevestigen van de huidige waarde is stil.
- De Factur-X-embedder behoudt de bronbytes verbatim en voegt nieuwe objecten toe; hij streeft ernaar PDF/A-3-conformiteit te behouden maar hervalideert niet. Leid de uitvoer door een externe PDF/A-validator voor harde attestatie.
- De C2PA-seam bevriest vijf invarianten: geen third-party-imports, alleen-bytes-contract, geen I/O, null-bij-miss-extractie, en geen claim-synthese in de stabiele laag.
- De caps van
JumbfBoxParserzijn publieke constanten; dimensioneer de invoer die je accepteert daartegen in plaats van limieten opnieuw af te leiden.
Publicatiegrens
Sectie met titel “Publicatiegrens”Deze pagina documenteert alleen extern waarneembaar gedrag en het ondersteunde publieke API-oppervlak. Interne namespace-paden, helper-klassen, mechanisme-tabellen, runbook-bestandsnamen en ticket-prefixen vallen buiten de scope.