Ga naar inhoud
getnextpdf.com

Enterprise editie

Validation — Diepe referentie

De Validation-module voert kant-en-klare, read-only structurele compliance-policies uit tegen ruwe PDF-bytes. Compliance::assess() past precies één CompliancePolicy toe en retourneert een ComplianceReport met naar ernst gepartitioneerde bevindingen en een verplichte juridische disclaimer. Er worden policies geleverd voor PDF/A-4 (plus de e- en f-varianten), PAdES baseline-structuur, een eIDAS-structuurprofiel, LTV/DSS-gezondheid, ZUGFeRD / Factur-X, FDA 21 CFR Part 11 en SEC Rule 17a-4 WORM-archivering. Elke policy is een pure functie: bytes erin, bevindingen eruit. Validation wijzigt het document nooit en voert nooit cryptografische verificatie uit.

Deze capaciteit wordt geleverd in NextPDF Enterprise (nextpdf/enterprise) en wordt geactiveerd met een licentie-envelope op Enterprise-niveau. Een deployment zonder dat recht laadt de classes van de capaciteit niet. Vergelijk edities en vraag een licentie aan.

Het Validation/Evidence-oppervlak wordt gelicentieerd door de capaciteit enterprise.compliance.evidence. Een geweigerd recht weigert de functie in plaats van stilzwijgend te degraderen.

TierValidation-oppervlak
CoreIn-process byte-stream-validators en een grammaticakruiscontrole; een resultaat zonder bevindingen is een gecontroleerd resultaat, geen certificaat.
ProIn-process EN 16931 / Factur-X / ZUGFeRD-validatie op de e-factuurlaag; geen kant-en-klare policies voor PDF/A-4, PAdES, LTV, FDA of SEC.
EnterpriseKant-en-klare structurele policies voor PDF/A-4, PAdES, LTV, ZUGFeRD, FDA Part 11 en SEC 17a-4 met één gecombineerd rapport (deze module).

De external-sidecar-gateway van Enterprise Compliance is een afzonderlijke, onderscheiden module.

Terminal window
composer require nextpdf/enterprise:^3
SymboolParametersStandaardgedragRetourneertWerpt of faalt metOpmerkingen
Compliance::__construct?ClockInterface $clock = nullSysteemklok wanneer er geen klok wordt geïnjecteerdDI-vriendelijke instance-vorm; de klok stempelt validatedAt
Compliance::runstring $pdfData, CompliancePolicy $policy, array $context = []Past precies één policy toe en meet de wall-clock-duurComplianceReportPropageert exceptions van custom policies; ingebouwde policies verzamelen bevindingen in plaats van te werpenInstance-methode
Compliance::assess (static)string $pdfData, CompliancePolicy $policy, array $context = []Construeert een default-instance en delegeert naar run()ComplianceReportZoals bij run()Fast path zonder configuratie
Policies::pdfA4 / ::pdfA4e / ::pdfA4f (static)PDF/A-4-structuurpolicy volgens ISO 19005-4:2020CompliancePolicye staat 3D/rich-media-annotaties toe; f voegt controles op ingebedde-bestandsrelaties toe
Policies::padesBaseline (static)PAdES B-B-structuurcontrolesCompliancePolicyAlleen structuur; geen cryptografische verificatie
Policies::eidasQualified (static)PAdES-structuurcontroles onder een eIDAS-gelabeld profielCompliancePolicyKwalificatie is afhankelijk van de TSP en het gekwalificeerde certificaat
Policies::ltvHealth (static)Structurele gezondheidscontrole van de DSSCompliancePolicyDSS-aanwezigheid wordt bepaald uit de actieve objectgraaf, fail-closed
Policies::zugferd (static)string $profile = 'BASIC'Normaliseert de profielalias en bouwt de ZUGFeRD-validatorCompliancePolicy\ValueError (onbekend profiel)Profielen: MINIMUM, BASIC, BASIC_WL, EN16931, EXTENDED
Policies::fdaPart11 (static)FDA 21 CFR Part 11-structuurpolicyCompliancePolicyZeven structurele controles, waaronder integriteit van de audit-trail-hashketen
Policies::sec17a4 / ::sec17a4Compatible / ::sec17a4Structural / ::sec17a4PreSign (static)SEC 17a-4 WORM-policy op de genoemde striktheidCompliancePolicyStriktheid wordt gemapt op WormComplianceLevel
CompliancePolicy (interface)Strategy-contract voor één standaardgetName(), getIdentifier(), getStandardReference(), validate(); door klant implementeerbaar
ComplianceReportReadonly value-objectBevindingen bij constructie gepartitioneerd naar ernstpasses(), fails(), totalFindings(), getDisclaimer(); publieke findings, errors, warnings, infos, policyName, policyId, standard, validatedAt, durationMs
ComplianceFindingSeverity $severity, string $ruleId, string $message, string $clause = '', string $suggestion = ''Eén regelresultaat met clausulereferentie en herstelhintStatic error() / warning() / info(); isError()
Severity (enum)3 string-gebaseerde casesError, Warning, InfoAlleen Error laat een rapport falen
WormComplianceLevel (enum)4 string-gebaseerde casesFull, Compatible, Structural, PreSignrequiresSignature(), requiresDocMdp(), requiresLtv(), maxDocMdpLevel()
PdfAPolicy, PadesValidator, LtvHealthCheck, ZugferdValidator, Sec17a4WormPolicy, Fda\FdaPart11PolicyConstructors per classImplementeren elk CompliancePolicy voor één standaardlist<ComplianceFinding> uit validate()Verkrijg via Policies; Sec17a4WormPolicy::getLevel() toont de geconfigureerde striktheid
Fda\FdaSigningIntent (enum)6 string-gebaseerde casesAuthoring, Review, Approval, Certification, Verification, RejectiontoPdfReasonString() levert de canonieke /Reason-string op
Fda\FdaAuditEvent::__constructDateTimeImmutable $timestamp, string $actor, FdaSigningIntent $action, string $documentHash, string $certificateSerial, string $previousEventHash = ''Berekent de SHA-256-ketenhash bij constructieInvalidArgumentException (timestamp niet UTC)Publieke eventHash; toXmpRdf() serialiseert één XMP-lijstitem
Fda\FdaAuditTrail::addEventFdaAuditEvent $eventVoegt de event toe wanneer de ketenschakel overeenkomt met het staarteinde van de trailselfInvalidArgumentException (hashketen verbroken)Ook createEvent(), verifyChain(), getLastEventHash(), getEvents(), embedInMetadata()
Fda\FdaSignatureEnforcer::configureSeedValueFdaSigningIntent $intent, string $tsaUrlBouwt een FDA-beperkte seed-value-configuratie voor handtekeningenSeedValueConfigVereist de FDA-redenenset, een timestamp en SHA-256- of sterkere digests
Fda\FdaSignatureEnforcer::applyToSequentialSigner $signer, SigningStrategy $strategy, string $signerName, FdaSigningIntent $intent, string $tsaUrl, string $fieldName = '', ?string $reason = nullVoegt een FDA-beperkte ondertekenaar toe aan een Pro-SequentialSignerSequentialSignerSerialiseert de beperkingen in het geproduceerde handtekeningveld
namespace NextPDF\Enterprise\Validation;
final readonly class Compliance
{
public function __construct(?ClockInterface $clock = null);
/** @param array<string, mixed> $context */
public function run(string $pdfData, CompliancePolicy $policy, array $context = []): ComplianceReport;
/** @param array<string, mixed> $context */
public static function assess(string $pdfData, CompliancePolicy $policy, array $context = []): ComplianceReport;
}
final class Policies
{
public static function pdfA4(): CompliancePolicy; // also pdfA4e(), pdfA4f()
public static function padesBaseline(): CompliancePolicy;
public static function eidasQualified(): CompliancePolicy;
public static function ltvHealth(): CompliancePolicy;
public static function zugferd(string $profile = 'BASIC'): CompliancePolicy;
public static function fdaPart11(): CompliancePolicy;
public static function sec17a4(): CompliancePolicy; // also sec17a4Compatible(), sec17a4Structural(), sec17a4PreSign()
}
interface CompliancePolicy
{
public function getName(): string;
public function getIdentifier(): string;
public function getStandardReference(): string;
/**
* @param array<string, mixed> $context
* @return list<ComplianceFinding>
*/
public function validate(string $pdfData, array $context = []): array;
}
final readonly class ComplianceReport
{
public const string LEGAL_DISCLAIMER;
public function passes(): bool;
public function fails(): bool;
public function totalFindings(): int;
public function getDisclaimer(): string;
}

Compliance::assess() (static) en Compliance::run() (instance, met een injecteerbare Psr\Clock\ClockInterface) passen precies één policy toe en retourneren een ComplianceReport. Extern waarneembare regels:

  • Puur read-only. Elke CompliancePolicy::validate() is een pure functie: bytes erin, bevindingen eruit. Een policy wijzigt nooit PDF-bytes. Deze architecturale invariant houdt validatie gescheiden van auto-fix en van de Evidence-module.
  • Ernst-gate. ComplianceReport::passes() is alleen true wanneer errors === []. Waarschuwingen en infos laten een rapport nooit falen. fails() is het complement.
  • Verplichte disclaimer. ComplianceReport::getDisclaimer() retourneert de constante juridische-disclaimertekst. Het tonen ervan in de uitvoer die de gebruiker te zien krijgt is vereist door het contract.
  • Rapportherkomst. Het rapport draagt de policynaam, identifier en standaardreferentie van de policy, de validatie-timestamp van de geïnjecteerde of systeemklok, en de gemeten duur in milliseconden.
  • Verzamelen, niet afbreken. Ingebouwde policies voeren alle toepasselijke controles uit en verzamelen elke bevinding in plaats van te stoppen bij de eerste fout.
  • Alleen via catalogus bereikbare DSS. LtvHealthCheck bepaalt DSS-aanwezigheid uit de actieve objectgraaf: actieve trailer, dan de /Root-catalogus, dan /DSS en de subsleutels ervan. Markerbytes die zijn geplant in comments, strings, weesobjecten of vervangen revisies tellen niet mee. Niet-parseerbare invoer wordt behandeld als geen DSS, dus de controle faalt gesloten. De controle is structureel; hij verifieert ingebedde OCSP/CRL-gegevens niet cryptografisch.
  • Structurele handtekeningcontroles. Policies::padesBaseline() en Policies::eidasQualified() valideren de PAdES-structuur uitsluitend op PDF-niveau. Kwalificatie onder eIDAS is afhankelijk van de TSP en het gekwalificeerde certificaat, die buiten deze module vallen.
  • Beleidsregels voor gereguleerde sectoren zijn structureel. FdaPart11Policy controleert aanwezigheid van handtekening, /Reason-intentie, /M-ondertekeningstijd, /Name-identiteit, afwezigheid van JavaScript, de FDA-audit-trail-namespace en integriteit van de hashketen. Sec17a4WormPolicy controleert tot 13 WORM-regels; WormComplianceLevel selecteert de striktheid. Full vereist DocMDP-niveau 1, Compatible accepteert niveau 2, en Structural / PreSign slaan de regels voor handtekening, DocMDP en DSS over. Geen van beide policies stelt juridische naleving vast.
  • ZUGFeRD-context. Policies::zugferd() controleert altijd de vereisten op PDF-niveau. Het valideert factuur-XML alleen wanneer de aanroeper ['xml' => $xmlData] in $context doorgeeft; anders zendt het de info-bevinding zugferd-xml-skipped uit.
  • Manipulatie-aantoonbare audit trail. FdaAuditTrail is een alleen-toevoegende SHA-256-hashketen. addEvent() weigert een verbroken schakel, verifyChain() leidt elke hash opnieuw af, en embedInMetadata() schrijft de trail in XMP onder http://ns.nextpdf.dev/fda/1.0/ met een PDF/A-uitbreidingsschema.
  • Een niet-PDF- of lege invoer levert in de ingebouwde policies foutbevindingen op in plaats van een exception. Controleer altijd passes() en toon de disclaimer.
  • Policies::zugferd() normaliseert profielaliassen (BASIC_WL, EN16931, EN_16931). Een onbekend profiel werpt \ValueError op factory-moment, voordat er enige validatie draait.
  • Een DSS met CRLs maar zonder OCSP-responses voldoet aan de controle op herroepingsmateriaal; de bevinding vermeldt het aanvaardbare alternatief. Geen van beide aanwezig is een fout.
  • Een ontbrekend /VRI-dictionary of /Certs-array levert waarschuwingen op, geen fouten; het rapport kan nog steeds slagen.
  • FdaAuditEvent weigert elke niet-UTC-timestamp met InvalidArgumentException bij constructie.
  • FdaAuditTrail::verifyChain() retourneert false bij elke gemanipuleerde of herordende event; het werpt nooit.
  • Custom CompliancePolicy-implementaties mogen vanuit validate() werpen; Compliance::run() vangt niet, dus dergelijke exceptions propageren naar de aanroeper.

Deze module voert geen ondertekening, geen cryptografische verificatie en geen sleutelbeheer uit. Het FIPS-modus-algoritmebeleid wordt beheerd door de Security- en Signature-modules. FdaSignatureEnforcer-seed values beperken FDA-gebonden handtekeningvelden tot de digest-methoden SHA-256, SHA-384 of SHA-512.

Deze policies controleren structurele attributen aan de hand van de benoemde standaarden. Het conformiteitsoordeel voor ISO/ETSI-profielen blijft een eigenschap van het uiteindelijke bestand plus een externe validator.

GedragReferentie
Conformiteit bepaald ten opzichte van de standaard, niet de producentISO 19005-4:2020 §5.2
Digitalehandtekening-dictionary / DSS voor validatie op lange termijnISO 32000-2:2020 §12.8
DSS is een dictionary die wordt gehouden door de DSS-sleutel van de documentcatalogusISO 32000-2:2020 §12.8.4.3
PAdES baseline-handtekeningniveausETSI EN 319 142-1 §5.4.3
Semantisch model van het EN 16931-profiel (ondersteunende referentie)Factur-X 1.08 (EN 16931)

De policies voor FDA 21 CFR Part 11 en SEC 17a-4 controleren uitsluitend structurele attributen; die regelgeving valt buiten het verificatiecorpus en draagt geen geverifieerde conformiteitsclaim. De clausulestrings binnen FDA-bevindingen (bijvoorbeeld §11.50, §11.10(e)) zijn door het product uitgezonden regelreferenties. De EN 16931-rij is een ondersteunende referentie onder de ophaaldrempel; het is geen harde conformiteitsclaim. Ondersteuning van een standaard is geen conformiteit ermee, en conformiteit is geen certificering — NextPDF bezit geen certificering en verleent die ook niet. Deze referentie is geen juridisch oordeel; raadpleeg je complianceteam voor de juridische toereikendheid.

  • Validation draait in-process en lokaal zonder netwerk-I/O. Een policy kan de invoer niet wijzigen.
  • Behandel PDF-bytes uit niet-vertrouwde bronnen als vijandig. De ingebouwde policies zijn totaal over willekeurige bytes en falen gesloten waar de structuur niet kan worden bepaald.
  • Toon ComplianceReport::getDisclaimer() in elke weergave van een rapport die de gebruiker te zien krijgt.
  • Rapporten en bevindingen kunnen persoonsgegevens dragen uit ondertekende documenten en audit-trail-metadata (namen van ondertekenaars, certificaatserienummers). De operator is eigenaar van de bewaar- en minimalisatiecontroles.
  • Custom policies implementeren CompliancePolicy; houd getIdentifier() uniek over alle policies voor serialisatie en caching.
  • Deze module betreft cryptografische functionaliteit; behandel hem in je eigen review als beveiligingsgevoelig.
  • Interne mechanismedetails blijven in de interne documentatie van de bronrepository en vallen buiten de scope van deze handleiding.

Deze pagina documenteert uitsluitend extern waarneembaar gedrag en het ondersteunde publieke API-oppervlak. Interne namespace-paden, helper-classes, mechanismetabellen, runbook-bestandsnamen en ticketprefixen vallen buiten de scope.