규정 준수: PDF/R-1 검증기, Arlington 문법, 수명 주기 도구
한눈에 보기
섹션 제목: “한눈에 보기”NextPDF\Compliance는 완성된 PDF를 읽고 규범적 계약에서 벗어나는 지점을 보고하는 바이트 스트림 검증기와 문법 교차 검사를 제공합니다. 검증기가 결과 0 건을 반환한다는 것은 해당 검증기가 구현한 조항에 대해 검사된 결과라는 뜻일 뿐, 포괄적인 인증서가 아닙니다.
composer require nextpdf/core:^3개념 개요
섹션 제목: “개념 개요”이 모듈은 세 부분으로 구성됩니다.
**PdfRValidator**는 ISO 23504-1:2020(PDF/R-1) 후보 바이트 스트림을 검증합니다. 이 검증기는 writer의 내부 상태가 아니라 원시 바이트를 대상으로 동작합니다. writer가 출력하려는 내용과 사양이 요구하는 내용 사이의 편차를 찾아냅니다. 이 검증은 최종 검사입니다. 구현된 조항 집합은 v5.1.0 클러스터입니다: §5 버전 식별 주석, §6.2.2/§6.2.3 헤더 허용 목록, §6.2.4 세대-0 및 객체 스트림 금지, §6.5.7 콘텐츠 스트림 연산자 허용 목록(q, Q, cm, Do만 허용), §6.6.1 이미지 XObject 키 허용 목록, §6.4.3 Info 사전 키 허용 목록, 그리고 §6.3 Catalog 키 허용 목록입니다. §6.7 증분 업데이트와 §6.8 암호화는 초기 클러스터 범위에서 명시적으로 제외되며, claims.json에도 그렇게 선언되어 있습니다. 검증기는 첫 번째 결과에서 예외를 발생시키지 않습니다. 한 번의 패스에서 모든 편차를 수집하므로 호출자는 전체 차이를 확인할 수 있습니다.
**PdfRConformancePolicy**는 PDF/R-1과 관련된 권장 사항이지만 정보성인 영역을 위한 불변 정책입니다. 규범적 §6 기준선은 구성으로 변경할 수 없습니다. 이 정책은 §A.5 구현 한계 권장 사항, §6.6.1 다중 스트립 비권장, 그리고 다운스트림 PDF/A 재분류를 위한 §A.6 XMP 요구 사항만 제어합니다.
**ArlingtonValidator**는 업스트림 PDF Association Arlington PDF 모델을 보고 전용 모드로 구동합니다. 현재 주기에서는 항상 권고 수준입니다: validateReportOnly()는 예외를 발생시키지 않습니다. 이는 세 가지 모드로 점진적으로 기능이 저하됩니다. 참조 검사기 바이너리가 있으면 구조화된 결과를 파싱합니다. 고정된 문법만 있는 경우에는 해당 문법 고정이 로드되었음을 증명하는 info 결과 하나를 방출합니다. 문법이 없으면 빈 목록을 반환합니다. WaiverRegistry를 사용하면 오케스트레이터가 감사 추적을 보존하면서 알려진 허용 가능한 불일치를 억제할 수 있습니다.
정직성 규칙은 CSS 지원 매트릭스 및 적합성 모듈과 동일합니다. 조항은 통과하는 테스트가 있고 규범적 조항이 인용된 경우에만 검증됨입니다. 구현되어 있지만 전용 통과 픽스처가 없는 조항은 주장됨입니다. 범위를 벗어난 조항은 모호하게 두지 않고 명시적으로 기술합니다. 결과 0 건의 PdfRValidator 결과는 실제로 검사하는 조항만을 단언합니다. 구현하지 않는 §6.7 이나 §6.8 에 대해서는 어떠한 주장도 하지 않습니다.
API 표면
섹션 제목: “API 표면”| 유형 | 종류 | 주요 멤버 |
|---|---|---|
NextPDF\Compliance\Validator\PdfRValidator | final class | validate(string $pdfBytes): list<PdfRValidationFinding> |
NextPDF\Compliance\Validator\PdfRValidationFinding | final readonly class | string $clause, 'error'|'warning'|'info' $severity, string $message |
NextPDF\Compliance\Profile\PdfRConformancePolicy | final readonly class | __construct(bool $enforceA5ImplementationLimits = true, bool $rejectMultiStripPages = false, bool $requireXmpForA6Compatibility = false); lax(), strictArchival() |
NextPDF\Compliance\Validator\ArlingtonValidator | final class | validateReportOnly(string $pdfPath): list<ArlingtonFinding> |
NextPDF\Compliance\Validator\WaiverRegistry | final class | isWaived(string $validator, string $ruleId, string $scopeKey): bool |
코드 예제 — 빠른 시작
섹션 제목: “코드 예제 — 빠른 시작”<?php
declare(strict_types=1);
use NextPDF\Compliance\Validator\PdfRValidator;
$validator = new PdfRValidator();$findings = $validator->validate(file_get_contents('candidate.pdf'));
if ($findings === []) { // Zero divergences from the §6 clauses PdfRValidator implements. // This is NOT a PDF/R-1 certificate — §6.7 and §6.8 are not checked. echo "No PDF/R-1 §6 divergences detected (implemented clause set).\n";} else { foreach ($findings as $f) { echo "[{$f->severity}] §{$f->clause}: {$f->message}\n"; }}코드 예제 — 프로덕션
섹션 제목: “코드 예제 — 프로덕션”<?php
declare(strict_types=1);
use NextPDF\Compliance\Validator\ArlingtonValidator;use NextPDF\Compliance\Validator\ArlingtonGrammarLoader;use NextPDF\Compliance\Validator\WaiverRegistry;
$validator = new ArlingtonValidator( waivers: new WaiverRegistry(/* loaded waiver entries */), grammar: new ArlingtonGrammarLoader(/* pinned submodule path */), adapter: null, // grammar-only mode when the reference checker is absent);
// Advisory by contract — never throws on findings.$findings = $validator->validateReportOnly('artifact.pdf');
foreach ($findings as $finding) { // Each finding pins the Arlington grammar commit SHA for provenance. logger()->info('arlington', [ 'rule' => $finding->ruleId, 'severity' => $finding->severity, 'grammarSha' => $finding->grammarSha, ]);}엣지 케이스 및 주의 사항
섹션 제목: “엣지 케이스 및 주의 사항”PdfRValidator는 전체 파서가 아니라 정규식 기반입니다. 이는NextPDF\Writer\PdfRWriter의 결정론적 출력을 대상으로 합니다. 해당 writer에 대한 편차 감지기로 동작합니다. 범용 PDF 파서가 아닙니다.- 결과 0 건 ≠ 완전한 PDF/R-1 적합성. §6.7(증분 업데이트)과 §6.8(암호화)은 v5.1.0 클러스터에 구현되어 있지 않으며
claims.json에 범위 외로 선언되어 있습니다. 편차가 없는 결과는 “구현된 조항 집합에서 편차 없음”으로만 간주하고, 그 이상으로 해석하지 않습니다. - Arlington은 권고 수준입니다.
validateReportOnly()는 현재 주기에서 빌드를 실패시키지 않습니다. CI는 이 아티팩트를 소비하지만, 이를 기준으로 게이트하지는 않습니다. - PDF/A ICC 검증은 여기에 없습니다. ISO 19005-4:2020 §6.2.2 OutputIntent ICC 검증은 Core의 Compliance 모듈이 아니라 Enterprise
PdfAManager(nextpdf/pro)에 있습니다. Core의 PDF/A 표면은ConformanceMode판별자뿐입니다. - 면제는 감사 추적을 보존합니다. 면제된 규칙은 결과 목록에서 억제되지만, 면제 항목은 이유에 대한 기록으로 남습니다.
PdfRValidator::validate()는 바이트 스트림에 대해 경계가 정해진 정규식 순회를 수행하는 단일 선형 패스입니다. 비용은 문서 크기에 비례하여 증가하며 모듈 예산 안에 충분히 머무릅니다. 문법 전용 모드의 ArlingtonValidator는 로드 증명 결과에 대해 O(문법 규칙 수)입니다. 참조 검사기 경로는 하위 프로세스이며, 경계는 NextPDF가 아니라 업스트림 도구가 정합니다. 이는 대역 외 CI 단계입니다.
보안 참고 사항
섹션 제목: “보안 참고 사항”이 검증기들은 신뢰할 수 없는 PDF 바이트를 읽습니다. PdfRValidator는 키 추출 전에 괄호 및 16 진수 리터럴을 제거하므로, 조작된 Creator 문자열이 거짓 /Name 키를 주입할 수 없습니다(ISO 32000-1:2008 §7.3.4.2 이스케이프 처리). Arlington 어댑터는 업스트림 검사기를 경계가 정해진 하위 프로세스로 실행합니다. 타임아웃이나 실행 오류는 부분 출력을 신뢰하기보다 “결과 없음”으로 처리합니다. PDF 파싱 공격 표면에 대해서는 프로젝트 위협 모델을 참조하십시오.
적합성
섹션 제목: “적합성”| 표준 | 조항 | Compliance 모듈이 수행하는 작업 | 상태 |
|---|---|---|---|
| ISO 23504-1:2020 (PDF/R-1) | §6.5.7 | PdfRValidator가 {q,Q,cm,Do} 콘텐츠 스트림 연산자 허용 목록을 강제합니다 | 검증됨 (단위 + 표준 프로파일 + 통합 테스트 통과) |
| ISO 23504-1:2020 (PDF/R-1) | §6.4.3 | PdfRValidator가 Info 사전 키 허용 목록을 강제합니다 | 검증됨 (테스트로 뒷받침됨) |
| ISO 23504-1:2020 (PDF/R-1) | §6.7, §6.8 | v5.1.0 클러스터에 구현되지 않음 | 명시적 비커버리지 (claims.json에 선언됨) |
| ISO 32000-2:2020 (PDF 2.0) | §7.5.2 | Catalog 키 허용 목록을 순회합니다 | 주장됨 (정규식 순회; 구조적) |
| ISO 19005-4:2020 (PDF/A-4) | §6.7.3 | Conformance 모듈을 통해 식별 스키마를 인식합니다 | 상호 참조 (/specifications/pdfa4/ 참조) |
지원은 적합성이 아닙니다. 결과를 반환하지 않는 PdfRValidator 실행은 입력이 검증기가 구현하는 §6 조항에서 벗어나지 않았음을 증명합니다. 이는 파일이 적합한 PDF/R-1 파일이라고 단언하지 않습니다: §6.7 과 §6.8 은 검사되지 않습니다. Arlington 교차 검사는 권고 수준이며 적합성을 단언하지 않습니다. PDF/A-4의 경우 권위 있는 검증기는 대역 외로 실행되는 veraPDF입니다 — veraPDF 오라클과 그 옵트인 게이팅에 대해서는 적합성 모듈을 참조하십시오.
인용문은 NextPDF 규정 준수 코퍼스에서 의역되었습니다. 전체 64 자 reference_id 다이제스트는 페이지 프런트매터와 _normative-evidence-conf.md에 기록됩니다.
참고 항목
섹션 제목: “참고 항목”- 적합성 모듈 —
ConformanceMode라우팅 및 veraPDF 오라클 - 감사 모듈 — 감사 추적 및 증명 표면
- PDF/A-4 사양 매핑 — ISO 19005-4 커버리지와 비커버리지
- 보안 모듈 — PDF 파싱 위협 모델