Ga naar inhoud

Conformiteit: ConformanceMode-routering en validatiegrens

NextPDF\Conformance is de enige discriminator die de writer vertelt op welk contract van de International Organization for Standardization (ISO) een bestand in Portable Document Format (PDF) is gericht. De bibliotheek stuurt de structuren uit die dat contract definieert. Ze certificeert het resulterende bestand niet als conform en kan dat ook niet. Alleen een externe validator kan conformiteit vaststellen.

Terminal window
composer require nextpdf/core:^3

De Conformance-module stelt twee publieke typen beschikbaar. ConformanceMode is een backed enum die het doelcontract benoemt (Plain, PdfUa1, PdfUa2, PdfA2, PdfA3, PdfA3b, PdfA3u, PdfA4, PdfA4e, PdfA4f). ConformancePolicy is een onveranderlijk waardeobject dat een modus combineert met onafhankelijke striktheidsschakelaars.

De modus is de enige bron van waarheid voor de downstream writer-gates. Voordat deze enum bestond, leidde de engine uit verspreide vlaggen af of een document volgens de specificatie getagd was. ConformanceMode::isTagged(), isAccessibility(), isArchival(), pdfaPart(), pdfaConformanceLetter() en requiresPdf17() leveren elk een getypeerd antwoord dat de writer rechtstreeks leest. De catalog, /MarkInfo, de herkomst van de bestandsheader en de Extensible Metadata Platform (XMP) pdfaid-markeringen blijven afgestemd op de gedeclareerde intentie.

Neem de ondersteuningsgrens letterlijk. NextPDF Core stuurt de structuren uit die deze standaarden definiëren. ISO 19005-4:2020 §6.7.3 specificeert het identificatieschema dat vastlegt welke PDF/A-variant een bestand claimt. ISO 19005-4:2020 stelt dat conformiteit wordt bepaald zoals gespecificeerd in clausule 5 ervan: aan de hand van de normatieve vereisten en door een validator, niet door de producerende bibliotheek. ISO 14289-2:2024 §6 omschrijft conformiteit als een eigenschap waaraan een bestand voldoet. Het instellen van een NextPDF-modus is noodzakelijke invoer voor een conform bestand. Op zichzelf is het geen conformiteitsresultaat.

Dit volgt dezelfde Geverifieerd-versus-Geclaimd-discipline als de ondersteuningsmatrix voor Cascading Style Sheets (CSS). Een mogelijkheid is alleen Geverifieerd als die zowel een geslaagde test- of oracle-run als een geciteerde clausule heeft. Al het andere is iets wat de bibliotheek uitstuurt: nuttig, maar geen conformiteitsgarantie. Conformiteit hoort bij het uiteindelijke bestand en bij een validator, niet bij de belofte van een bibliotheek. Valideer de uitvoer met veraPDF (zie “Conformiteit” hieronder).

Een tweede grens is belangrijk voor archiveringswerk. Het authoren van PDF/A-4, inclusief het OutputIntent-woordenboek, het ingebedde International Color Consortium (ICC)-profiel en het XMP-uitbreidingsschema, is ondergebracht in de nextpdf/pro-uitbreiding, niet in Core. In een Core-only-installatie werpt Document::enablePdfA() een InvalidConfigException op omdat de security.pdfa-capability niet is geregistreerd. Core blijft eigenaar van de ConformanceMode-discriminator, zodat introspectie en het PDF/Universal Accessibility (PDF/UA-2)-getagde pad werken, maar Core authort niet zelfstandig een PDF/A-4-bestand.

TypeSoortBelangrijkste leden
NextPDF\Conformance\ConformanceModeenum: stringPlain, PdfUa1, PdfUa2, PdfA2, PdfA3, PdfA3b, PdfA3u, PdfA4, PdfA4e, PdfA4f; isTagged(), isAccessibility(), isArchival(), requiresPdfUa2PageTabs(), pdfaPart(): ?int, pdfaConformanceLetter(): string, requiresPdf17(): bool
NextPDF\Conformance\ConformancePolicyfinal readonly class__construct(ConformanceMode $mode = PdfUa2, bool $strictUa2 = false, bool $rejectUnvalidatedLang = false, …); lax(), strictUa2(), withUax9IsolateSupport(), withoutAstShadowMode(), withBlackPointCompensation(), withStrictOcspProducedAtTolerance(), withAllowStaleOcsp()

ConformancePolicy handhaaft één invariant in de constructor: de strikte PDF/UA-2-schakelaars gelden alleen wanneer de modus PdfUa2 is, en strictUa2 = true forceert rejectUnvalidatedLang = true. Incoherente combinaties werpen een InvalidConfigException in plaats van stilzwijgend te degraderen.

<?php
declare(strict_types=1);
use NextPDF\Conformance\ConformanceMode;
$mode = ConformanceMode::PdfA4f;
// Introspect the declared contract — these drive writer-side gates.
$mode->pdfaPart(); // 4
$mode->pdfaConformanceLetter(); // 'F'
$mode->requiresPdf17(); // false (PDF/A-4 is PDF 2.0 lineage)
$mode->isArchival(); // true

De route die met Core wordt meegeleverd en een conformiteitscontract van begin tot eind doorloopt, is de PDF/UA-2-getagde route. Dit uitvoerbare voorbeeld staat in examples/31-pdfua2-tagged.php. Het is ook het oracle-doel voor het strikte PDF/UA-2-profiel.

<?php
declare(strict_types=1);
use NextPDF\Core\Document;
$doc = Document::createStandalone();
// Set the tagged-PDF contract BEFORE writing content so the HTML pipeline
// wires the TaggedContentEmitter at parser-construction time.
$doc->enableTaggedPdf(lang: 'en');
$doc->setTitle('Accessible report');
// … write content …
$doc->save(__DIR__ . '/out/report-ua2.pdf');
// The library has now emitted PDF/UA-2 structures. It has NOT asserted
// conformance. Verify the file with the pinned veraPDF oracle:
//
// php oracle/run.php pdfua.strict
//
// (Requires the veraPDF Docker image — opt-in; see "Conformance" below.)
  • Het authoren van PDF/A-4 is Premium. In een Core-only-installatie werpt Document::enablePdfA() een InvalidConfigException (security.pdfa niet beschikbaar). Core beheert de discriminator, niet de OutputIntent/ICC/XMP-emissie. Zie /specifications/pdfa4/.
  • Paraplugeval versus variantgevallen. PdfA4 is het paraplugeval en rapporteert een lege pdfaConformanceLetter(). ISO 19005-4:2020 §6.7.3 schrijft voor dat een bestand dat noch aan PDF/A-4e noch aan PDF/A-4f voldoet, geen pdfa:conformance opgeeft. Gebruik PdfA4e / PdfA4f alleen voor de varianten uit bijlage B / bijlage A.
  • Strikte PDF/UA-2 is opt-in. ConformancePolicy::lax() is de achterwaarts compatibele standaard. strictUa2() forceert /MarkInfo /Marked true en afwijzing van niet-gevalideerde taalwaarden volgens Best Current Practice (BCP) 47. Het inschakelen ervan op een modus die geen PdfUa2 is, werpt een uitzondering.
  • isTagged() is variantbewust. Plain, PdfA2, PdfA3b en PdfA4e rapporteren ongetagd. De writer mag geen structuurboom afleiden uit alleen de archiveringsmodus.
  • Een ingestelde modus is geen geslaagd bestand. Het instellen van PdfA4 maakt de uitvoer niet tot een geldig PDF/A-4-bestand. Voer een validator uit.

ConformanceMode en ConformancePolicy zijn pure waardetypen. Het oplossen van enum-cases en match-dispatch gebeurt in O(1), zonder allocatie buiten het onveranderlijke policy-object om. Ze voegen geen meetbare kosten toe aan het schrijfpad. De writer, niet de discriminator, domineert het modulebudget (wall_ms: 1500). De veraPDF-oracle is een out-of-band stap in continuous integration (CI), geen onderdeel van de documentgeneratie.

De strikte schakelaars in ConformancePolicy reguleren fail-closed beveiligingsgedrag: securityPkiRfc5280Strict (Request for Comments (RFC) 5280 §6 padvalidatie), strictOcspProducedAtTolerance (RFC 6960 §4.2.2.1 afwijkingsvenster) en allowStaleOcsp (standaard false; wijst Open Certification Status Protocol (OCSP)-responses af die geen nextUpdate bevatten). Deze standaardwaarden zijn conservatief en gaan in een toekomstige major over op strikt gedrag, conform de gedocumenteerde strategie voor achterwaartse compatibiliteit. Zie de beveiligingsmodule en het dreigingsmodel van het project voor details over het handtekeningpad.

NextPDF certificeert geen conformiteit. Het stuurt structuren uit die door de onderstaande standaarden zijn gedefinieerd. Een afzonderlijke validator beslist of een bestand conform is.

StandaardClausuleWat NextPDF Core doetStatus
ISO 14289-2:2024 (PDF/UA-2)§6Stuurt de structuurboom, /MarkInfo /Marked true (strikt), /Lang en pdfuaid XMP uit via het getagde Core-padGeverifieerd profiel: pdfua.strict gevalideerd door de veraPDF-oracle (php oracle/run.php pdfua.strict) wanneer de veraPDF-binary aanwezig is (opt-in gate)
ISO 19005-4:2020 (PDF/A-4)§6.7.3Stuurt de pdfaid:part / pdfa:conformance-discriminator uit via ConformanceModeGeclaimd (emissie van de discriminator, unit-getest); het authoren van een PDF/A-4-bestand is alleen Premium
ISO 32000-2:2020 (PDF 2.0)§7.5.2Basis catalog/document-structuurGeclaimd (basisgedrag van de engine)

Ondersteuning is geen conformiteit. NextPDF Core stuurt PDF/UA-2- en PDF/A-4-identificatiestructuren uit, met implementatiebewijs in tests/Unit/Conformance/. Alleen een validator die het bijbehorende profiel uitvoert, kan vaststellen dat een bestand conform is aan PDF/A-4 of PDF/UA-2. Volgens ISO 19005-4:2020 clausule 5 is het bepalen van conformiteit de taak van de validator, niet van de producerende bibliotheek.

De veraPDF-gating is expliciet over haar vereiste. De oracle (oracle/run.php, oracle/lib/OracleRunner.php) roept een vastgepinde veraPDF Docker-image aan. Wanneer Docker of de image ontbreekt, sluit de runner af met code 2 (infrastructuurfout) en verifieert niets. Het pdfua.strict-profiel is daarom een opt-in conformiteitsgate. Het bewijst conformiteit alleen op machines waar de veraPDF-binary aanwezig is. NextPDF levert geen ingebedde validator mee en doet bij afwezigheid daarvan geen conformiteitsclaim.

Citaten zijn geparafraseerd uit het NextPDF compliance-corpus. De volledige reference_id-digests van 64 tekens zijn vastgelegd in de frontmatter van de pagina en in _normative-evidence-conf.md.