Lewati ke konten
getnextpdf.com

Enterprise edisi

Compliance — Referensi Mendalam

Modul Compliance mengarahkan PDF yang sudah jadi ke sidecar validasi eksternal dan mengembalikan satu hasil yang ternormalisasi. ComplianceGateway menentukan sidecar yang bertanggung jawab dari sebuah ComplianceProfile, menegakkan kebijakan ketersediaan fail-closed, dan membungkus setiap verdikt tool dalam sebuah ExternalValidationResult. Bridge tersedia untuk veraPDF (PDF/A, PDF/UA, PDF 2.0 Arlington), EU DSS (level PAdES), sidecar gabungan Mustang/KoSIT (ZUGFeRD, Factur-X, EN 16931), dan daemon KoSIT mandiri. Modul ini juga menyediakan pencapan kesiapan AiReadyCertifier dan sebuah runner untuk test suite XRechnung KoSIT resmi.

Kemampuan ini tersedia di NextPDF Enterprise (nextpdf/enterprise) dan aktif dengan amplop lisensi tingkat Enterprise. Deployment tanpa entitlement tersebut tidak memuat kelas-kelas kemampuan ini. Bandingkan edisi dan dapatkan lisensi.

Permukaan Compliance/Evidence dilisensikan oleh kemampuan enterprise.compliance.evidence. Entitlement yang hilang atau kedaluwarsa menolak fitur ini; ia tidak menurunkan perilaku secara diam-diam.

TierPermukaan compliance
CorePemeriksaan byte-stream dan tata bahasa in-process; tanpa delegasi sidecar eksternal.
ProValidasi EN 16931 / Factur-X / ZUGFeRD in-process; tanpa sidecar eksternal.
EnterpriseGateway validator eksternal (modul ini) dengan hasil terpadu dan kebijakan fail-closed.

Validator e-invoice in-process Pro dan sidecar ZUGFeRD eksternal Enterprise adalah permukaan yang berbeda. Gateway validator eksternal tersedia hanya di paket nextpdf/enterprise.

Terminal window
composer require nextpdf/enterprise:^3
SymbolParameterPerilaku defaultMengembalikanMelempar atau gagal denganCatatan
ComplianceGateway::__constructlist<ExternalValidator> $validators, LoggerInterface $logger, bool $optional = falseMengindeks validator berdasarkan nama toolMode optional menurunkan pemeriksaan ketersediaan menjadi hanya-peringatan
ComplianceGateway::validatestring $pdfContent, ComplianceProfile $profile, array $options = []Menentukan validator via ComplianceProfile::toolName(), memeriksa ketersediaan, mendelegasikan?ExternalValidationResultComplianceSidecarUnavailableException; InvalidArgumentException (tidak ada validator terdaftar untuk tool)Mengembalikan null hanya dalam mode optional saat sidecar mati
ComplianceGateway::validateAllProfilesstring $pdfContent, string $toolNameMemvalidasi setiap profil yang dipetakan ke toollist<ExternalValidationResult>Sama seperti validate()Melewati hasil null (mode optional)
ComplianceGateway::healthCheckMenyelidiki setiap endpoint health sidecar terdaftararray<string, bool>Melaporkan keterjangkauan; tidak memvalidasi dokumen
ComplianceGateway::buildComplianceMatrix (static)list<ExternalValidationResult> $results, string $commitShaMereduksi hasil menjadi matriks berversi skemaarray<string, mixed>Versi skema 1.0; mencatat output tool, tidak menegaskan apa pun
ComplianceProfile (enum)15 case berbasis stringMemetakan setiap profil ke label standar dan sebuah toolstandardReference(): string, toolName(): string
ExternalValidator (interface)Kontrak bridge sidecar di atas PSR-18validate() melempar ComplianceSidecarUnavailableException saat kegagalan transportgetToolName(), isAvailable(), validate()
VeraPdfValidator::validateSignature interfacePOST multipart ke sidecar REST veraPDF; parsing laporan JSONExternalValidationResultComplianceSidecarUnavailableException; InvalidArgumentException (profil tidak didukung)PDF/A, PDF/UA, Arlington; hanya mem-parse JSON, tidak pernah XML
DssValidator::validateSignature interfacePOST JSON Base64 ke sidecar REST EU DSSExternalValidationResultComplianceSidecarUnavailableException; InvalidArgumentException (profil tidak didukung)PAdES B-B hingga B-LTA; konstruktor menolak timeout di bawah satu detik
ZugferdExternalValidator::validateSignature interfacePOST multipart ke sidecar gabungan Mustang/KoSITExternalValidationResultComplianceSidecarUnavailableException (juga saat circuit breaker terbuka); InvalidArgumentException (profil tidak didukung)ZUGFeRD 2.4, Factur-X 1.08, EN 16931; circuit breaker injeksi opsional
KoSitValidator::validateSignature interfacePOST XML mentah ke daemon KoSIT mandiriExternalValidationResultComplianceSidecarUnavailableException; InvalidArgumentException (profil tidak didukung)EN 16931 saja; mem-parse laporan SVRL Schematron secara fail-closed
ExternalValidationResultValue object readonlyVerdikt tool ternormalisasipasses(), fails(), nonConformanceCount(), toComplianceMatrix()
NonConformanceValue object readonlySatu temuan dengan rule id, klausa, severity, lokasitoArray()
ComplianceSidecarUnavailableExceptionstring $toolName, string $endpoint, int $code = 0, ?Throwable $previous = nullSinyal ketidaktersediaan sidecar fail-closedtoolName dan endpoint readonly publik
AiReadyCertifier::certifystring $pdfBytesMengevaluasi tiga kriteria kesiapan; mencap provenance XMParray{0: AiReadyCertification, 1: string}InvalidArgumentException (pencapan memerlukan tabel cross-reference klasik)Elemen kedua sama dengan input saat level-nya not_certified
AiReadyCertificationValue object readonlyPenilaian kesiapan dengan level, jumlah kriteria, isu, source hashLabel kesiapan internal, bukan sertifikasi standar
XRechnungTestSuiteRunner::__constructstring $suitePath, ExternalValidator $validator, bool $useCuratedNegativeFallback = trueMenentukan direktori suite yang telah diekstrakInvalidArgumentException (direktori tidak ada)Menargetkan test suite XRechnung KoSIT resmi
XRechnungTestSuiteRunner::runbool $stopOnFirstFailure = falseMemvalidasi setiap instance suite melalui bridgeXRechnungTestSuiteResultXRechnungTestSuiteException (validator tidak tersedia; tidak ada file XML)Juga isAvailable(), getSuitePath(), discoverTestFiles()
XRechnungTestSuiteResultValue object readonlyHasil suite teragregasiallPassed(), totalCount(), getFailures(), getErrors(), toSummary()
XRechnungTestCaseResultValue object readonlyHasil per-casepassed(), hasError(), getFilename()
XRechnungTestSuiteExceptionKonstruktor statisSinyal kegagalan runtime suiteselfvalidatorUnavailable(), noTestFilesFound(string $suitePath)
namespace NextPDF\Enterprise\Compliance;
final class ComplianceGateway
{
/** @param list<ExternalValidator> $validators */
public function __construct(
array $validators,
private readonly LoggerInterface $logger,
private readonly bool $optional = false,
);
/** @param array<string, mixed> $options */
public function validate(
string $pdfContent,
ComplianceProfile $profile,
array $options = [],
): ?ExternalValidationResult;
/** @return list<ExternalValidationResult> */
public function validateAllProfiles(string $pdfContent, string $toolName): array;
/** @return array<string, bool> */
public function healthCheck(): array;
/**
* @param list<ExternalValidationResult> $results
* @return array<string, mixed>
*/
public static function buildComplianceMatrix(array $results, string $commitSha): array;
}
interface ExternalValidator
{
public function getToolName(): string;
public function isAvailable(): bool;
/** @param array<string, mixed> $options */
public function validate(
string $pdfContent,
ComplianceProfile $profile,
array $options = [],
): ExternalValidationResult;
}
enum ComplianceProfile: string
{
case PdfA1b = 'pdfa-1b';
// PdfA2b, PdfA3b, PdfA4, PdfA4f, PdfUa1, PdfUa2, Pdf20Arlington,
// PadesBasic, PadesTimestamp, PadesLongTerm, PadesArchive,
// Zugferd24, FacturX108, En16931
public function standardReference(): string;
public function toolName(): string;
}
final class AiReadyCertifier
{
/** @return array{0: AiReadyCertification, 1: string} Tuple of [certification, stamped PDF bytes] */
public function certify(string $pdfBytes): array;
}

ComplianceGateway::validate() menentukan ExternalValidator terdaftar yang getToolName()-nya cocok dengan ComplianceProfile::toolName(), memeriksa isAvailable(), mendelegasikan, dan mengembalikan ExternalValidationResult yang ternormalisasi. Aturan yang dapat diamati secara eksternal:

  • Default fail-closed. Ketika sidecar yang ditentukan tidak tersedia dan mode optional mati, panggilan memunculkan ComplianceSidecarUnavailableException. Dokumen tidak diperiksa; ia tidak pernah dianggap lolos.
  • Mode optional. Membangun gateway dengan optional: true (operator menyambungkannya dari variabel lingkungan NEXTPDF_COMPLIANCE_OPTIONAL) menurunkan sidecar yang tidak tersedia menjadi peringatan tercatat dan pengembalian null. Pemanggil harus memperlakukan null sebagai “tidak diperiksa”. Mode optional hanya mencakup probe ketersediaan pra-penerbangan; kegagalan transport selama panggilan validasi itu sendiri memunculkan ComplianceSidecarUnavailableException dalam kedua mode.
  • Profil tidak dikenal. Profil tanpa validator terdaftar memunculkan InvalidArgumentException; ia tidak pernah lolos secara diam-diam.
  • Semantik lolos. ExternalValidationResult::passes() mensyaratkan conformant bernilai true dan nol non-conformance. Setiap hasil membawa profil, nama dan versi tool, jumlah assertion, temuan, SHA-256 dari byte yang divalidasi, timestamp UTC, dan durasi panggilan.
  • Matriks adalah catatan, bukan penegasan. buildComplianceMatrix() adalah reducer statis yang menghasilkan struktur berversi skema dengan versi tool dan sebuah commit SHA untuk keterlacakan. Ia mencatat output tool; ia tidak menegaskan apa pun.
  • Alur data. Seluruh byte-stream PDF ditransmisikan ke sidecar yang dikonfigurasi melalui klien PSR-18. Setiap validasi dicatat melalui PSR-3 dengan profil, tool, lolos/gagal, jumlah assertion, dan durasi.

Routing profil-ke-tool, sebagaimana dikembalikan oleh ComplianceProfile::standardReference() dan ::toolName():

Case profilReferensi standarTool
pdfa-1b, pdfa-2b, pdfa-3b, pdfa-4, pdfa-4fISO 19005-1/-2/-3/-4 (Level B; Level F untuk 4f)veraPDF
pdfua-1, pdfua-2ISO 14289-1:2014, ISO 14289-2:2024veraPDF
pdf20-arlingtonISO 32000-2:2020 (model Arlington)veraPDF
pades-b-b, pades-b-t, pades-b-lt, pades-b-ltaETSI EN 319 142-1 B-B hingga B-LTAEU DSS
zugferd-2.4, factur-x-1.08, en-16931ZUGFeRD 2.4 / Factur-X 1.08 / EN 16931-1:2017Mustang/KoSIT

AiReadyCertifier::certify() mengevaluasi tiga kriteria: keberadaan signature struktural, kesehatan LTV, dan ketiadaan enkripsi. Tiga kriteria yang lolos menghasilkan level certified; satu atau dua menghasilkan partial; nol menghasilkan not_certified. Pada certified atau partial, ia menambahkan incremental update yang membawa stream provenance XMP dan override Catalog; byte asli tidak pernah dimutasi. Level “certified” adalah label kesiapan internal NextPDF, bukan sertifikasi standar.

VeraPdfValidator hanya mem-parse respons sidecar JSON (tanpa XML; XXE-clean secara konstruksi). KoSitValidator mem-parse laporan SVRL XML dari daemon dengan deklarasi DOCTYPE ditolak dan akses jaringan dinonaktifkan, dan memperlakukan laporan yang tidak dapat di-parse sebagai kegagalan panggilan.

  • Timeout atau error transport sidecar muncul sebagai ComplianceSidecarUnavailableException dari bridge; default fail-closed berlaku.
  • Respons sidecar non-200 menghasilkan hasil gagal dengan temuan spesifik-tool (misalnya VERAPDF-HTTP-ERROR); ia tidak pernah menjadi kelolosan conformance.
  • Body JSON atau XML sidecar yang cacat adalah kegagalan validasi panggilan, bukan kelolosan conformance.
  • Hasil EU DSS tanpa signature gagal dengan DSS-NO-SIGNATURES. Indikasi selain TOTAL_PASSED gagal dengan DSS-SIG-INVALID. Level signature di bawah baseline yang diharapkan gagal dengan DSS-LEVEL-MISMATCH.
  • DssValidator mempublikasikan anggaran timeout per-request-nya pada setiap request melalui header X-NextPDF-Timeout-Seconds; klien PSR-18 integrator harus menghormatinya sehingga sidecar yang macet tidak dapat memblokir thread pemanggil tanpa batas.
  • ZugferdExternalValidator secara opsional mengarahkan panggilan sidecar melalui circuit breaker yang diinjeksi; breaker yang terbuka dipetakan ke ComplianceSidecarUnavailableException (fail-fast, tetap fail-closed). Default-nya adalah breaker no-op.
  • KoSitValidator::isAvailable() menerima HTTP 200 dan 405 dari probe health daemon; daemon menjawab GET dengan 405 saat sehat.
  • Pencapan AiReadyCertifier gagal secara fail-closed dengan InvalidArgumentException ketika dokumen asli tidak memiliki tabel cross-reference klasik (misalnya, cross-reference stream).
  • XRechnungTestSuiteRunner::run() menolak berjalan ketika validator tidak tersedia atau suite tidak memuat file XML; dengan useCuratedNegativeFallback diaktifkan ia menggantikan sebuah korpus negatif terkurasi ketika suite tidak menyertakan instance yang tidak valid.

Modul ini tidak melakukan signing dan tidak menyimpan kunci. Kebijakan algoritma mode FIPS diatur oleh modul Security dan Signature. Conformance signature didelegasikan ke EU DSS, yang membuat penentuannya sendiri.

Gateway mendelegasikan verdikt conformance ke tool eksternal; desain ini mencerminkan batasan standar itu sendiri bahwa conformance ditentukan terhadap persyaratan, bukan ditegaskan oleh produser.

PerilakuReferensi
Kewajiban conforming-processor; conformance ditentukan terhadap standarISO 19005-4:2020 §5.2
Persyaratan file PDF/A-4 vs. self-assertion produserISO 19005-4:2020 §6.6.4
Konformitas PDF/UA-2 adalah properti dari fileISO 14289-2:2024 §6
Level signature baseline PAdESETSI EN 319 142-1 §5.4.3

Tool eksternal menghasilkan verdikt. NextPDF tidak memegang sertifikasi dan tidak memberikan apa pun; dukungan untuk sebuah profil bukanlah conformance terhadapnya. Hasil validasi adalah catatan pemeriksaan-struktur teknis untuk referensi, bukan nasihat hukum; konsultasikan dengan tim compliance Anda untuk menilai kecukupan regulasi.

  • Operator menghosting dan mengoperasikan sidecar, menyematkan versinya, membatasi jangkauan jaringannya, memvalidasi TLS-nya, dan mengendalikan lingkungan yang mengaktifkan mode optional. Endpoint sidecar adalah batas kepercayaan; kontrol residensi dan retensi untuk dokumen, hasil, dan log adalah tanggung jawab operator.
  • Output buildComplianceMatrix() dirancang untuk keterlacakan CI: sematkan commit SHA dan arsipkan matriks di samping artefak build.
  • Runner XRechnung mengharapkan test suite resmi diekstrak ke direktori lokal; pesan konstruktornya menyebutkan sumber unduhan publik.
  • Detail mekanisme internal tetap berada dalam dokumentasi internal repositori sumber dan berada di luar cakupan manual ini.

Halaman ini mendokumentasikan hanya perilaku yang dapat diamati secara eksternal dan permukaan API publik yang didukung. Path namespace internal, kelas pembantu, tabel mekanisme, nama file runbook, dan prefiks tiket berada di luar cakupan.