CheckFileCompliance

규격 준수, 문서 검사

PDF/UA 리더 프로필 선택

PDF/UA 검사는 XMP가 pdfuaid:part=2를 식별할 때 part 2를 선택하고 그 외에는 part 1 검사를 유지합니다. 여기 설명된 구형 PDF/UA-1 검사가 part 2에 적용된다는 뜻은 아닙니다

PDF/UA-2 프로필은 핵심 식별, 네임스페이스, 역할, 구조 검사를 구현합니다. 구조화된 보고서는 PDF/UA-2와 ISO 14289-2를 사용하며 fullCertification=false와 검증되지 않은 범위를 밝힙니다

대상 part를 강제하려면 CheckFilePDFUACompliance나 RunPDFUAValidationPipelineTask를, 기능 한도를 살펴보려면 GetPDFUAReadValidationCoverageJSON을 사용하십시오

설명

외부 PDF 파일을 읽고 선택한 ISO 규격 표준에 대해 검증합니다. 반환 값은 0(파일이 선택한 검사를 문제 없이 통과)이거나 검출된 모든 문제를 나열하는 0이 아닌 StringListID 핸들입니다. 목록의 각 항목은 짧은 코드, 콜론, 사람이 읽을 수 있는 메시지이며 GetPDFUADiagnostics가 사용하는 것과 정확히 같은 코드 형식입니다. 결과는 GetStringListCount와 GetStringListItem으로 나열합니다PDF/A 검사는 여섯 가지 컨포먼스 모드(PDF/A-1a, PDF/A-1b, PDF/A-2a, PDF/A-2b, PDF/A-3a, PDF/A-3b)를 모두 다루며 어떤 규칙 집합을 적용할지 결정하려고

pdfaid:part/pdfaid:conformance XMP 항목을 읽습니다PDF/UA-1 검사(v3.56.0에서 추가됨)는 외부 PDF를 ISO 14289-1에 대해 검사하며 PDF/A

10xxx 코드와 시각적으로 구분되도록 00xxx 범위의 진단 코드를 내보냅니다

구문

Delphi

Function TPDFlib.CheckFileCompliance(Const InputFileName, Password: WideString; ComplianceTest, Options: Integer): Integer;

ActiveX

Function PDFlib::CheckFileCompliance(InputFileName As String, Password As String, ComplianceTest As Long, Options As Long) As Long

DLL

int DLCheckFileCompliance(int InstanceID, const wchar_t * InputFileName, const wchar_t * Password, int ComplianceTest, int Options);

매개변수

InputFileName검증할 PDF 파일의 전체 경로입니다. 파일은 읽기 전용으로 열리며 수정되지 않습니다.
Password파일을 여는 데 사용되는 암호입니다. 암호화되지 않은 문서에는 빈 문자열을 전달합니다. 암호화된 문서는 올바른 암호를 제공했는지와 무관하게 PDF/A 검사에 실패(코드 00006)합니다. PDF/A는 암호화를 금지합니다.
ComplianceTest검사할 표준입니다.

1 — PDF/A (ISO 19005-1/-2/-3, 여섯 가지 컨포먼스 수준 모두).
2 — PDF/UA-1 (ISO 14289-1:2014, 접근성 PDF).
3 — PDF/X (ISO 15930, PDF/X-6 계열 포함).
4 — PDF/VT-3 (PDF/X-6 계열 기반의 ISO 16612-3:2020).
5 — PDF/R-1 제한적 래스터 교환.
6 — PDF/VCR-1 가변 콘텐츠 대체 템플릿.
7 — PDF/E-1 엔지니어링 문서 교환.
Options검사를 조정하는 비트 플래그입니다.

0 — 기본값: 문서에서 발견된 모든 문제를 보고합니다.
1 — 첫 번째 문제 이후 중단하고 즉시 반환합니다. 호출자가 통과/실패 신호만 필요할 때 유용합니다.

반환 값

0파일이 선택한 표준에 부합합니다.
0이 아님검출된 각 비컨포먼스를 설명하는 항목을 가진 StringListID 핸들입니다. 핸들은 문서가 닫히거나 ReleaseStringList가 호출될 때까지 유효합니다.

PDF/A 이슈 코드 (ComplianceTest = 1)

00002PDF 버전이 컨포먼스 수준이 허용하는 최대치를 초과합니다(PDF/A-1은 1.4까지, PDF/A-2와 PDF/A-3은 1.7까지). 상세 행은 문제가 되는 버전과 허용되는 최대치를 알려줍니다.
00003카탈로그에 /OCProperties(선택적 콘텐츠/레이어)가 포함되어 있으며 PDF/A-1에서 금지됩니다. PDF/A-2와 PDF/A-3는 레이어를 허용하므로 이 검사가 발동되지 않습니다.
00005XMP pdfaid:part+pdfaid:conformance 쌍이 없거나, 형식이 잘못되었거나, 합법적인 값 집합 1A, 1B, 2A, 2B, 3A, 3B를 벗어난 값을 담고 있습니다. 라이브러리가 적용할 규칙 집합을 판단할 수 없으므로 Options와 무관하게 치명적 문제로 보고됩니다.
00006문서가 암호화되어 있습니다. PDF/A는 모든 파트에서 암호화를 금지합니다.
00007카탈로그에 /OutputIntents 항목이 없습니다. 모든 PDF/A 파트는 렌더링 색상 공간이 명확히 정의되도록 출력 인텐트를 요구합니다.
00011카탈로그에 /MarkInfo 항목이 없습니다. a 수준 컨포먼스(PDF/A-1a, 2a, 3a)에만 필요합니다. 태그 PDF는 자신을 선언해야 합니다.
00012카탈로그에 /StructTreeRoot 항목이 없습니다. a 수준 컨포먼스에만 필요합니다. 태그 PDF 문서에는 논리 구조 트리가 있어야 합니다.

PDF/UA-1 이슈 코드 (ComplianceTest = 2)

10001XMP 메타데이터 스트림에 pdfuaid:part가 없거나 값이 1이 아닙니다. ISO 14289-1 §5는 컨포먼스 파일이 이 속성으로 자신을 식별할 것을 요구하고 ISO 14289-1 §6.2는 이것 없이 컨포먼스를 표시하는 것을 금지합니다.
10002문서 카탈로그에 /Metadata 스트림이 없습니다. PDF/UA-1 컨포먼스 선언은 이 스트림 안에 기록되며 이것이 없으면 파일이 접근성을 갖췄다고 알릴 수 없습니다.
10003카탈로그 /MarkInfo 사전이 없거나 /Marked가 true가 아닙니다. ISO 14289-1 §7.1은 모든 컨포먼스 파일이 태그를 갖췄다고 선언하여 보조 기술이 구조 트리에 의존할 수 있도록 할 것을 요구합니다.
10004카탈로그에 /StructTreeRoot 항목이 없습니다. PDF/UA-1 파일에는 문서의 읽기 순서와 의미를 기술하는 논리 구조 트리가 포함되어야 합니다.
10005/ViewerPreferences 사전이 없거나 /DisplayDocTitle 항목이 true가 아닙니다. ISO 14289-1 §7.1은 컨포먼스 리더가 파일 이름 대신 창 제목 표시줄에 문서 제목을 드러내도록 요구합니다.
10006카탈로그 /Lang 항목이 없거나 비어 있습니다. ISO 14289-1 §7.2(ISO 32000-1 §14.9.2 참조)는 모든 컨포먼스 파일이 자연어를 선언하여 화면 낭독기가 올바른 음성과 발음 규칙을 선택하도록 요구합니다.
10007XMP 메타데이터 스트림에 비어 있지 않은 Dublin Core dc:title이 없습니다. ISO 14289-1 §7.1은 "문서를 명확히 식별하는 dc:title 항목"을 요구합니다.
10008/MarkInfo 사전이 /Suspects를 true로 설정하고 있습니다. ISO 14289-1 §7.1에 따르면 PDF/UA 컨포먼스를 주장하는 파일은 Suspects 값이 false여야 하며 true는 태깅에 오류가 있다고 알려진 상태를 표시합니다.
10009문서 /RoleMap이 하나 이상의 표준 구조 타입을 재사상합니다. ISO 14289-1 §7.1에 따르면 ISO 32000-1 §14.8.4에서 정의된 표준 태그(P, H1..H6, Figure, Table 등)는 재사상될 수 없습니다. 상세 행은 재사상된 첫 번째 표준 태그를 알려줍니다.
10010파일이 암호화되어 있지만 암호화 /P 권한 키의 비트 10(마스크 512, "접근성을 위한 추출")이 설정되어 있지 않습니다. ISO 14289-1 §7.16은 암호화된 모든 컨포먼스 파일이 보조 기술이 콘텐츠에 도달할 수 있도록 접근성 추출을 허용할 것을 요구합니다.
10011동적 XFA 폼이 검출되었습니다. XFA XDP 패킷에 <dynamicRender>required</dynamicRender>가 포함되어 있습니다. ISO 14289-1 §7.15는 컨포먼스 파일에서 동적 XFA 폼을 금지하며 정적 XFA는 허용됩니다.
10012Reference XObject(/Ref 항목을 가진 Form XObject)가 검출되었습니다. ISO 14289-1 §7.20은 참조 XObject를 금지하는데, 참조 XObject는 참조된 콘텐츠를 보조 기술에 노출하지 않은 채 한 PDF가 다른 PDF를 참조로 임베딩할 수 있게 하기 때문입니다.
10013하나 이상의 TrapNet 주석이 검출되었습니다. ISO 14289-1 §7.18.2는 컨포먼스 파일에서 TrapNet을 명시적으로 금지합니다. 상세 행은 발견된 주석 수를 보고합니다.
10014하나 이상의 페이지가 주석을 가지고 있지만 페이지 사전에 /Tabs /S를 설정하지 않습니다. ISO 14289-1 §7.18.3은 그런 페이지의 탭 순서가 구조 트리를 따를 것을 요구하며 이는 /Tabs /S로 신호됩니다. 상세 행은 문제가 되는 페이지 수를 보고합니다.
10015하나 이상의 Link 주석에 비어 있지 않은 /Contents 대체 설명이 없습니다. ISO 14289-1 §7.18.5는 각 Link 주석이 화면 낭독기가 링크 대상을 알릴 수 있도록 접근 가능한 설명을 가질 것을 요구합니다. 상세 행은 문제가 되는 Link 주석 수를 보고합니다.
10016하나 이상의 임베디드 파일 FileSpec 사전에 /F 파일 이름 키가 없습니다. ISO 14289-1 §7.11은 모든 임베디드 파일 FileSpec이 /F와 /UF를 모두 가질 것을 요구합니다.
10017하나 이상의 임베디드 파일 FileSpec 사전에 /UF 유니코드 파일 이름 키가 없습니다. ISO 14289-1 §7.11은 모든 임베디드 파일 FileSpec이 /F와 /UF를 모두 가질 것을 요구합니다.
10018하나 이상의 선택적 콘텐츠 구성 사전에 비어 있지 않은 /Name 텍스트 문자열이 없습니다. ISO 14289-1 §7.10은 모든 OCG 구성 사전(기본 D 항목과 OCProperties/Configs의 모든 사전)이 비어 있지 않은 /Name을 가질 것을 요구합니다.
10019하나 이상의 선택적 콘텐츠 구성 사전에 금지된 /AS 키가 포함되어 있습니다. ISO 14289-1 §7.10은 사용 정보에 의한 자동 상태 조정을 막기 위해 어떤 OCG 구성 사전에서도 /AS를 명시적으로 금지합니다.
10020문서가 참조하는 하나 이상의 비(非)Standard-14 폰트가 폰트 프로그램을 임베딩하지 않습니다(FontDescriptor에 FontFile, FontFile2, FontFile3 항목이 없음). ISO 14289-1 §7.21.4.1은 렌더링에 사용되는 모든 폰트가 프로그램을 임베딩할 것을 요구합니다. Type 3 폰트는 글리프가 인라인 CharProcs이므로 이 검사를 건너뜁니다.
10021하나 이상의 CIDFontType2 하위 폰트에 /CIDToGIDMap 항목이 없습니다. ISO 14289-1 §7.21.3.2는 임베딩된 모든 Type 2 CIDFont가 /CIDToGIDMap(CID를 글리프 인덱스로 사상하는 스트림 또는 Identity 이름)을 가질 것을 요구합니다.
10022하나 이상의 Standard 14 폰트(Helvetica, Times, Courier, Symbol, ZapfDingbats와 굵게/기울임 변형)가 임베딩된 폰트 프로그램 없이 참조되고 있습니다. ISO 14289-1 §7.21.4 NOTE 5는 14종 표준 Type 1 폰트에 대한 임베딩 예외가 없음을 분명히 합니다.
10023하나 이상의 폰트에 /ToUnicode CMap이 없으며 §7.21.7 예외 목록에 해당하지 않습니다. 예외 목록은 사전 정의된 MacRomanEncoding / MacExpertEncoding / WinAnsiEncoding, 하위 CIDFont가 Adobe GB1 / CNS1 / Japan1 / Korea1 문자 컬렉션을 사용하는 Type 0 폰트, 비심볼릭 TrueType 폰트를 포함합니다.
10024문서 순서에서 첫 번째 제목 요소가 H1(또는 강한 구조의 H)이 아닙니다. ISO 14289-1 §7.4.2: "제목 태그가 사용된다면 H1이 첫 번째여야 합니다".
10025문서 순서에서 제목 수준 건너뛰기가 하나 이상 검출되었습니다(예: H1 바로 뒤에 H3가 오며 H2를 건너뜀). ISO 14289-1 §7.4.2는 내림 제목 시퀀스가 중간 수준을 건너뛰지 않고 엄격한 수치 순서로 진행할 것을 요구합니다.
10026하나 이상의 Widget 주석에 /StructParent 항목이 없습니다. ISO 14289-1 §7.18.4는 Widget 주석이 Form 구조 태그 안에 중첩될 것을 요구하며 /StructParent가 없으면 Widget은 구조 트리에서 도달할 수 없습니다. 상세 행은 개수를 보고합니다.
10027하나 이상의 Widget 주석에 /StructParent 항목이 있지만 그 값이 StructTreeRoot/ParentTree를 통해 /S = Form인 구조 요소로 해석되지 않습니다. ISO 14289-1 §7.18.4는 모든 Widget 주석이 Form 구조 태그 안에 중첩될 것을 요구합니다. 가능한 원인: /ParentTree 항목이 아예 없거나, 비(非)StructElem(원시 정수 / MCR 사전)을 가리키거나, Form이 아닌 태그를 지명합니다.
10028하나 이상의 비심볼릭 TrueType 폰트가 /Encoding이나 /BaseEncoding이 아닌 MacRomanEncoding(또는 Encoding 사전의 WinAnsiEncoding)을 가지고 있습니다. ISO 14289-1 §7.21.6은 비심볼릭 TrueType 인코딩을 이 두 가지 사전 정의 이름으로 제한합니다.
10029하나 이상의 심볼릭 TrueType 폰트가 폰트 사전에 /Encoding 항목을 가지고 있습니다. ISO 14289-1 §7.21.6 네 번째 단락은 이를 금지하며 심볼릭 TrueType 인코딩은 임베딩된 폰트 프로그램의 cmap 테이블로만 표현되어야 합니다.
10030하나 이상의 L(목록) 구조 요소에 ListNumbering 속성이 없습니다. ISO 14289-1 §7.6은 모든 L 태그가 이 속성으로 번호 매기기 스타일을 선언할 것을 요구합니다. 유효한 값은 None, Disc, Circle, Square, Decimal, UpperRoman, LowerRoman, UpperAlpha, LowerAlpha입니다(ISO 32000-1 Table 347).
10031하나 이상의 Link 주석이 /IsMap 항목이 true인 URI 액션 사전을 가지고 있습니다. ISO 14289-1 §7.18.5는 콘텐츠의 다른 곳에서 /IsMap = true 키 없이 동등한 기능이 제공되지 않는 한 URI 액션에서 /IsMap를 금지합니다. 정당한 IsMap 사용 사례가 있는 작성자는 이 진단을 스스로 억제해야 합니다.
10032하나 이상의 Note 구조 요소에 /ID 항목이 없습니다. ISO 14289-1 §7.9는 모든 Note 태그가 고유한 /ID를 선언하여 교차 참조가 안정적인 대상에 도달할 수 있도록 할 것을 요구합니다.
10033두 개 이상의 Note 구조 요소가 같은 /ID 값을 공유합니다. 상세 행은 검출된 중복 쌍의 수를 보고합니다. ISO 14289-1 §7.9는 Note ID가 문서 안에서 고유할 것을 요구합니다.
10034하나 이상의 비심볼릭 TrueType 프로그램(Symbolic 플래그가 해제되고 FontFile2 스트림이 있는 FontDescriptor)이 유일한 서브테이블이 심볼릭 (3,0) Microsoft 항목인 cmap 테이블을 임베딩하고 있습니다. ISO 14289-1 §7.21.6 첫 번째 단락은 프로그램이 /Encoding이 선언하는 코드 포인트를 렌더링할 수 있도록 최소 하나의 비심볼릭 cmap 서브테이블을 요구합니다.
10035하나 이상의 비심볼릭 TrueType 폰트가 Adobe Glyph List 2.0에 없는 글리프 이름을 포함하는 /Encoding 배열을 가진 /Differences을 선언합니다. .notdef는 사양이 암묵적으로 허용하므로 허용 목록에 있습니다. ISO 14289-1 §7.21.6 세 번째 단락은 모든 Differences 항목이 AGL에 속할 것을 요구합니다.
10036하나 이상의 단순 TrueType 폰트 너비가 임베딩된 폰트 프로그램의 해당 메트릭과 1/1000 em보다 크게 다릅니다. ISO 14289-1 §7.21.5는 /Widths 배열이 임베딩된 글리프 메트릭과 일치할 것을 요구합니다.
10037하나 이상의 CIDFontType2 너비가 임베딩된 TrueType 프로그램의 해당 메트릭과 1/1000 em보다 크게 다릅니다. ISO 14289-1 §7.21.5는 /W 배열이 임베딩된 글리프 메트릭과 일치할 것을 요구합니다.
10038Type 1 폰트 디스크립터 /CharSet가 임베딩된 폰트 프로그램에 있는 하나 이상의 글리프 이름을 누락합니다. ISO 14289-1 §7.21.4.2는 이 항목이 임베딩된 모든 글리프를 나열할 것을 요구합니다.
10039CID 폰트 디스크립터 /CIDSet가 임베딩된 폰트 프로그램의 글리프로 사상되는 하나 이상의 CID를 누락합니다. ISO 14289-1 §7.21.4.2는 비트 집합이 임베딩된 모든 CID를 식별할 것을 요구합니다.
10040텍스트를 포함하는 Form XObject가 마크드 콘텐츠 바깥의 페이지 콘텐츠에서 호출되고 있습니다. ISO 14289-1 §7.20은 Form XObject 콘텐츠가 구조 요소에 통합될 것을 요구합니다.
10041하나 이상의 텍스트 표시 피연산자가 .notdef 글리프로 해석됩니다. ISO 14289-1 §7.21.8은 텍스트 렌더링 모드와 무관하게 .notdef 참조를 금지합니다.
10042하나 이상의 미디어 클립 데이터 사전(/S /MCD로 식별되고 선택적으로 /Type /MediaClip)에 필수 /CT 콘텐츠 타입 항목이 없습니다. ISO 14289-1 §7.18.6은 ISO 32000-1 Table 274의 이 선택적 키를 필수로 격상시킵니다.
10043하나 이상의 미디어 클립 데이터 사전에 필수 /Alt 배열(언어 문자열 + 대체 텍스트 쌍)이 없습니다. ISO 14289-1 §7.18.6은 보조 기술이 임베딩된 멀티미디어에 대한 설명을 알릴 수 있도록 ISO 32000-1 Table 274의 이 선택적 키를 필수로 격상시킵니다.
10044하나 이상의 구조 트리 노드가 두 개 이상의 직접 H(일반 제목) 자식을 가지고 있습니다. ISO 14289-1 §7.4.4는 이를 명시적으로 금지하므로 절을 나누거나 H 태그를 번호가 매겨진 H1..H6 수준으로 바꾸십시오.

비고

PDF/A 검사는 납품 전 빠른 자가 점검을 위한 것입니다. 파일을 완전히 탈락시키는 문서 수준 문제(잘못된 PDF 버전, 누락된 OutputIntent, A 수준에서 누락된 구조 트리, 암호화, PDF/A-1의 레이어)를 잡아냅니다. 이 검사는 모든 콘텐츠 스트림 연산자를 순회하거나 그려진 객체마다 폰트 임베딩이나 색상 공간 참조를 검증하지 않습니다. 그런 검증에는 전용 PDF/A 검증기(예: veraPDF)가 필요합니다. 이 함수를 1차 검사와 빌드 파이프라인의 회귀 관문으로 사용하십시오. 라이브러리가 문제 목록을 재사용 가능한 텍스트 보고서로 만들게 하려면 CreatePreflightReport나 SavePreflightReport를 사용하십시오. 텍스트, JSON, HTML, CSV 보고서 출력에는 CreatePreflightReportEx나 SavePreflightReportEx를 사용하거나 전체 보고서 워크플로는 Preflight Reports를 참고하십시오동반 API인

GetPDFUADiagnostics는 외부 파일이 아니라 현재 빌드 중인 메모리 내 문서에 대해 PDF/UA(ISO 14289-1)의 유사한 검사를 수행합니다이 라이브러리로 PDF/A 출력을 만들 때는 콘텐츠를 추가하기 전에

SetPDFAMode를 호출합니다. SetPDFAMode 내부의 생성 측 가드가 선택한 파트가 금지하는 작업을 차단하므로 그렇게 만든 문서는 보통 CheckFileCompliance를 자동으로 통과합니다

예제

// Validate a delivered PDF/A file and print all issues
var
  Issues, Count, I: Integer;
begin
  Issues := PDF.CheckFileCompliance('archive.pdf', '', 1, 0);
  if Issues = 0 then
    WriteLn('archive.pdf: PDF/A conformant')
  else
  begin
    Count := PDF.GetStringListCount(Issues);
    WriteLn('archive.pdf: ', Count, ' PDF/A issue(s) detected:');
    for I := 1 to Count do
      WriteLn('  ', PDF.GetStringListItem(Issues, I));
  end;
end;

// Fast pass/fail gate in a CI pipeline — stop on the first issue
var
  Failed: Boolean;
begin
  Failed := PDF.CheckFileCompliance('build/output.pdf', '', 1, 1) <> 0;
  if Failed then
    Halt(1);
end;

참고 항목

Preflight Reports, CreatePreflightReport, CreatePreflightReportEx, SavePreflightReport, SavePreflightReportEx, ComparePreflightReports, SetPDFAMode, GetPDFUADiagnostics, GetStringListCount, GetStringListItem, SetPDFUAMode

컴플라이언스 테스트 3은 PDF/X(ISO 15930)을 감사합니다. 에디션 식별, 출력 인텐트, 페이지 지오메트리, 내장 폰트, 금지 기능 집합. PDF/X-6에서는 추가로 주석 플래그와 고정 외관, AcroForm과 서명 외관, XFA와 뷰어 생성 외관 제외, 액션 배치, 액션 체인, 허용되는 이름 있는 액션 집합, 모든 UseBlackPtComp 값을 검증합니다

컴플라이언스 테스트 4는 PDF/VT-3 식별 메타데이터, 그 PDF/X-6 패밀리 기반, DPartRoot와 DPart 그래프, DPM 이름과 값, 레코드 수준, 페이지 순서, 정확한 리프 커버리지를 감사합니다. 구성된 검사는 파서 패스 하나를 공유합니다

컴플라이언스 테스트 5는 PDF/R-1 마커 배치, 버전과 암호화, 세대 0 간접 객체, 제한된 딕셔너리와 필터, 단일 스트림 페이지 프로그램, 순서가 있는 래스터 스트립, 이미지 인코딩, 페이지 커버리지, 실효 해상도를 감사합니다. 공유 검증 파이프라인 파싱을 재사용할 수 있습니다

컴플라이언스 테스트 6은 PDF/X 기반과 PDF/VCR-1 XMP 식별, 단일 직접 템플릿 루트, 선언된 필드, 선택적 페이지 선택 필드, 모든 리프 PassThrough 대체 플레이스홀더, 페이지 바인딩, MCID와 경계 상자를 감사합니다. 공유 검증 파이프라인 파싱을 재사용할 수 있습니다

컴플라이언스 테스트 7은 PDF/E-1 식별과 라이프사이클 메타데이터, 트레일러 식별자, 허용되는 암호화, 출력 인텐트와 장치 색 공간, 콘텐츠 연산자, 폰트, 주석, 폼, 옵셔널 콘텐츠, 액션, 외부 파일 참조, 그래픽 상태, 3D 스트림 제한을 감사합니다. 공유 검증 파이프라인 파싱을 재사용할 수 있습니다