function ValidatePdfUa: TPdfUaValidationResult;
ValidatePdfUa는 XMP에서 PDF/UA-1과 PDF/UA-2를 판별하고 선택된 프로필의 규칙을 적용합니다
pdfuaid:part = 1과 일치하는 pdfaExtension:schemas 설명을 담은 XMP 메타데이터 스트림 (§5)dc:title 항목 (§7.1)StructTreeRoot (§7.1) — 문서가 태깅을 아예 담을 수 있으려면 필요합니다/MarkInfo << /Marked true /Suspects false >> (§7.1)/ViewerPreferences << /DisplayDocTitle true >> (§7.1)/Lang (§7.2)/ID 배열과 암호화 부재xmp:CreateDate / xmp:ModifyDate (Info/XMP 일치를 위해 권장)결과는 TPdfUaValidationResult 레코드입니다:
puc1, puc2, pucNone, 또는 pucUnknownTPdfUaValidationIssues 집합입니다: pvuaiMissingXmpMetadata, pvuaiMissingPdfUaIdentifier, pvuaiMissingExtensionSchema, pvuaiMissingDcTitle, pvuaiMissingStructTreeRoot, pvuaiMissingMarkInfo, pvuaiSuspectsTrue, pvuaiMissingDisplayDocTitle, pvuaiMissingLang, pvuaiEncryptionPresent, pvuaiMissingTrailerId, pvuaiMissingXmpDates, pvuaiFontNotEmbedded, pvuaiFontMissingToUnicode, pvuaiMissingTabsOrder, pvuaiFigureMissingAlt, pvuaiFormulaMissingAlt, pvuaiNoteMissingId. Round 1(v1.66.0)은 pvuaiRoleMapMissing(7.1), pvuaiOptionalContentAsKey(7.10), pvuaiXfaPresent(7.15), pvuaiTrapNetAnnotation(7.18.2), pvuaiReferenceXObject(7.20), 그리고 이전의 any-encryption 플래그를 대체하는 정밀한 암호화 위반인 pvuaiEncryptionPBitMissing(7.16 —)을 추가합니다. Round 2(v1.67.0)는 pvuaiLinkMissingContents(7.18.5), pvuaiAnnotationMissingContents(7.18.1), pvuaiEmbeddedFileMissingName(7.11), pvuaiMediaClipMissingAlt(7.18.6.2), pvuaiCidFontMissingCidToGidMap(7.21.3.2)를 추가합니다. Round 3(v1.68.0)은 pvuaiUriActionIsMap(7.18.5)과 pvuaiHeadingSequenceViolation(7.4.2 — 최초의 구조 트리 수준 규칙이며 이제 ValidatePdfUaStructureElements가 번호 붙은 헤딩 시퀀스를 검증합니다)를 추가합니다. Round 4(v1.69.0)는 pvuaiWidgetOutsideForm(7.18.4 — 구조 트리 Widget 중첩)와 pvuaiSubsetMissingCharSet(7.21.4.2)를 추가합니다. Round 5(v1.70.0)는 pvuaiSubsetMissingCidSet(7.21.4.2), pvuaiToUnicodeForbiddenValue(7.21.7), pvuaiLangInvalidFormat(7.2), pvuaiOrderedListMissingListNumbering(7.6 — L 요소가 표 347 집합 밖의 ListNumbering 값을 선언하면 v1.71.0부터 발생하며 속성이 아예 없는 경우는 표시하지 않음)를 추가합니다. Round 7(v1.80.0)은 §7.5 표 검사인 pvuaiTableStructureInvalid(TR 밖의 TH/TD, 또는 필수 컨테이너 밖의 TR/THead/TBody/TFoot), pvuaiTableHeaderMissingScope(어떤 셀도 Headers 연결을 쓰지 않는 표에서 Scope 속성도 ID도 갖지 않는 TH), pvuaiTableHeadersUndefinedId(문서 내 어떤 구조 요소도 ID를 정의하지 않는데 셀이 Headers 배열로 헤더를 참조하는 경우. 해석 가능한 항목 곁의 개별 dangling 항목은 권위 있는 검증기와 마찬가지로 허용됨)를 추가합니다. v1.81.0은 §7.6 리스트 중첩 검사 pvuaiListStructureInvalid(L 컨테이너 밖의 LI, 또는 LI 항목 밖의 Lbl/LBody. 중첩 리스트와 Note/BibEntry 안의 Lbl은 수용)를 추가합니다. v1.82.0은 §7.1 RoleMap 해석 검사 pvuaiRoleMapRemapsStandard(RoleMap 항목이 표준 구조 유형을 재정의)와 pvuaiRoleMapUnresolved(사용된 비표준 구조 유형에 RoleMap 항목이 없거나 그 체인이 dangling이거나 순환. 표준 유형에 도달하는 간접 체인은 수용하고 사용되지 않는 RoleMap 항목은 결코 판정하지 않음)를 추가합니다. v1.83.0은 §7.4.4 헤딩 모델 검사 pvuaiHeadingModelMixed(일반 H 태그와 번호 붙은 H1..Hn 헤딩의 혼용)와 pvuaiHeadingMultipleInNode(둘 이상의 자식 H 헤딩을 가진 구조 노드)를 추가합니다. v1.84.0은 §7.1 태그 없는 콘텐츠 검사 pvuaiUntaggedContent(marked-content ID로 페이지 구조 트리가 주장하지도 않고 Artifact로 표시되지도 않는 렌더링 텍스트나 이미지 객체. 흔한 장식을 함부로 표시하지 않도록 맨 경로 객체는 검사 대상에서 제외)를 추가합니다. v1.85.0은 §7.15 동적 XFA 검사 pvuaiXfaDynamic(XFA 구성이 dynamicRender를 required로 설정)를 추가하고 any-XFA 후보 pvuaiXfaPresent를 은퇴시킵니다(정적 XFA는 적합하며 enum 값은 남지만 더 이상 발생하지 않음). v1.85.1부터 §7.18.3 pvuaiMissingTabsOrder 검사는 페이지별로 동작합니다. 어노테이션이 있는 모든 페이지는 자체 딕셔너리에 /Tabs /S가 필요합니다. v1.86.0은 §7.21.6 TrueType 인코딩 검사 pvuaiTrueTypeEncodingInvalid(non-symbolic TrueType에 Encoding이 없거나 그 값이 BaseEncoding을 통해서라도 직접 MacRomanEncoding이나 WinAnsiEncoding이 아닌 경우)과 pvuaiSymbolicTrueTypeEncoding(symbolic TrueType이 비표준 Encoding 이름을 담는 경우. 적합한 문서들이 표준 인코딩 폰트를 symbolic으로 잘못 표기하는 일이 흔하기 때문에 표준 이름은 허용됨)을 추가합니다. v1.87.0은 §7.21.3 복합 폰트 검사 pvuaiCidSystemInfoMismatch(임베디드 CMap과 자손 CIDFont가 Registry/Ordering에서 불일치하거나 CIDFont Supplement가 CMap의 것을 초과), pvuaiCMapNotEmbedded(이름으로 참조된 CMap이 표 118 사전 정의 CMap이 아님), pvuaiCMapWModeMismatch(임베디드 CMap의 딕셔너리 WMode가 스트림 내용과 다름. 바이트 단위로 읽을 수 있는 비압축 CMap 스트림만 판정 가능)을 추가하고, pvuaiCidFontMissingCidToGidMap이 Identity 이외의 CIDToGIDMap 이름도 표시하도록 넓혔습니다. v1.93.0은 Pdfium 객체 모델 계층을 추가합니다 — 라이브 Pdfium 객체 트리에서 계산되는 세 가지 정밀한 폰트별/문자별 이슈입니다: pvuaiPdfiumFontNotEmbedded(§7.21.4, 페이지가 실제로 사용하는 폰트가 FPDFFont_GetIsEmbedded 기준으로 임베디드되지 않음), pvuaiPdfiumUnicodeMapError(§7.21.7, 페이지 문자가 FPDFText_HasUnicodeMapError 기준으로 잘못된 유니코드 매핑을 가짐), pvuaiPdfiumNotDefGlyph(§7.21.8, 문자가 유니코드 0 / .notdef로 렌더링됨). 이들은 문서 전체 zero-embedded 또는 no-/ToUnicode 신호에서만 작동하는 바이트 수준 pvuaiFontNotEmbedded / pvuaiFontMissingToUnicode 휴리스틱을 보완하며, 순회는 세 수준(페이지 루프, 객체별 루프, 문자 스캔)에서 단락 평가됩니다. v1.94.0은 절 단위 재감사에서 나온 여섯 개의 2차 패스 이슈를 추가합니다: pvuaiHeadingFormatInvalid(§7.4.3, H로 시작하는 헤딩 태그가 일반 H도 H + 순수 아라비아 숫자도 아닌 경우 — 구분자, 공백, 로마 숫자는 금지), pvuaiMissingDocumentOutline(§7.17, 북마크 아웃라인이 없는 다중 페이지 문서. 단일 페이지 문서는 제외), pvuaiStructElementLangInvalid(§7.2, 유효한 BCP 47 태그가 아닌 구조 요소 /Lang 값), pvuaiWidgetMissingPrintField(§7.14 / §7.18.4, PrintField 속성 소유자가 없는 Widget 구조 요소), pvuaiLinkNotInStructureTree(§7.18.5, /Subtype /Link 어노테이션이 있는데 구조 트리가 Link 요소를 노출하지 않는 문서), 그리고 Pdfium 어노테이션 계층 pvuaiPdfiumAnnotationMissingContents / pvuaiPdfiumLinkMissingContents(§7.18.1 / §7.18.5, 숨김, crop box 밖, Popup, Widget 어노테이션을 면제하는 정밀 스캔으로 바이트 수준 휴리스틱의 거짓 양성을 제거). v1.95.0은 재현율과 건전성을 개선합니다. §7.21.3.3 pvuaiCMapWModeMismatch와 §7.21.7 pvuaiToUnicodeForbiddenValue 검사가 이제 스캔 전에 FlateDecode로 압축된 CMap / ToUnicode 스트림을 먼저 풀고(이전에는 비압축 스트림만 판정), pvuaiSubsetCharSetEmpty(§7.21.4.2)는 /CharSet 문자열 값이 빈 Type 1 서브셋 FontDescriptor를 표시합니다(기존 missing-key 검사는 키가 아예 없는 경우만 잡았습니다). v1.96.0은 PDF/A 검증기에서 포팅한 pvuaiAnnotationFlagsViolation(§7.18.1, 면제 대상이 아닌 어노테이션이 Hidden / Invisible / NoView를 담음)과 pvuaiActionTargetMissing(§7.18.5, 대상 키가 없는 GoToR / URI / SubmitForm 액션)을 추가하고, 구조 트리 병합의 페이지 간 ParentIndex 재기준 버그와 간접 참조나 배열 값에서 조기 종료하던 RoleMap 파서를 수정했습니다Conformance가 실제 PDF/UA 수준이고 Issues가 비어 있으면 True를 반환합니다PDF/UA-2 검증은 추가로 네 자리 pdfuaid:rev, 실효 PDF 2.0,
A/W/S 어노테이션 탭 순서, XFA 없음, 비어 있지 않은 optional-content 구성
이름, PDF 2.0에서 폐기된 Sound나 Movie 어노테이션 없음, 명시적으로 번호가
붙은 H1부터 Hn까지의 헤딩 구조 유형을 요구합니다
v3.73.0부터 non-Artifact 페이지 텍스트나 구조 Title, Alt,
ActualText, Expansion 문자열에 유효한 실효 /Lang
선언이 없으면 이슈 집합에 pvuaiNaturalLanguageUncovered가 포함될 수
있습니다
v3.74.0부터 Artifact 페이지 객체가 페이지 구조 트리가 주장하는 MCID를 가지고
있으면 — 경로 기반 페이지 매김 아티팩트를 포함해 — 이슈 집합에
pvuaiArtifactInStructureTree가 포함될 수 있습니다
v3.75.0부터 유니코드 매핑 이슈는 하나의 객체 범위
InspectPdfUaUnicodeCoverage 패스에서 나옵니다. 유효한
ActualText는 자신이 나온 텍스트 객체의 문자만 커버하고, Artifact와
PDFium이 생성한 문자는 의미적 커버리지에서 제외됩니다
ValidatePdfUa는 읽기 전용 검사입니다 — 문서를 수정하지 않으며 반복
호출해도 안전합니다. PDF를 아카이브 시스템이나 접근성 검사기에 넘기기 전에
호출해 비적합 사항을 운영자에게 드러내세요. 이슈 목록이 필요 없는 흔한
"이 문서가 PDF/UA-1인가?" 확인이라면 더 가벼운
PdfUaConformance 속성을 사용하는 편이 좋습니다
Conformance = pucUnknown이고 Issues 집합이 빈 레코드를 반환합니다/Suspects true가 나타날 때만 pvuaiSuspectsTrue를 표시합니다. /Suspects 키가 아예 없는 문서는 그 지점에서 적합한 것으로 간주합니다(사양은 true만 금지합니다)N 0 R)로 제공하더라도 ISO 14289-1 7.1의 필수 /ViewerPreferences /DisplayDocTitle true와 /MarkInfo /Marked true /Suspects false 항목을 강제합니다. 기존 키는 보존되고 딕셔너리는 다시 쓴 카탈로그에서 직접 딕셔너리로 정규화됩니다
uses System.TypInfo;
var
Outcome: TPdfUaValidationResult;
Issue: TPdfUaValidationIssue;
begin
Pdf1.FileName := 'C:\Incoming\report.pdf';
Pdf1.Active := True;
Outcome := Pdf1.ValidatePdfUa;
Memo1.Lines.Add('Level: ' + GetEnumName(TypeInfo(TPdfUaConformance),
Ord(Outcome.Conformance)));
for Issue in Outcome.Issues do
Memo1.Lines.Add('- ' + GetEnumName(TypeInfo(TPdfUaValidationIssue), Ord(Issue)));
end;