function ValidatePdfA: TPdfAValidationResult;
ValidatePdfA는 열려 있는 문서를 훑으며 ISO 19005-1(Cor.1:2007 포함)이 정의한 모든 PDF/A 적합성 마커를 찾습니다:
pdfaid:part와 pdfaid:conformance 항목을 담은 XMP 메타데이터 스트림. 문서가 어떤 PDF/A 수준(1a, 1b, 2b, 3b, ...)을 대상으로 작성되었는지 이 항목이 검증기에 알려줍니다/ID 배열 (ISO 19005-1 6.1.3에 따라 필수)xmp:CreateDate와 xmp:ModifyDate (6.7.3 예제 2에 따라 Info 딕셔너리에 CreationDate / ModDate 값이 있을 때 필요)pdfaExtension:schemas 컨테이너 (6.7.8 / Cor.1이 요구)결과는 TPdfAValidationResult 레코드입니다:
pac1a, pac1b, pac2a, pac2b, pac2u, pac3a, pac3b, pac3u, pacNone, 또는 인식할 수 없는 수준의 PDF/A 마커에 대한 pacUnknown)TPdfAValidationIssue 값들의 TPdfAValidationIssues 집합입니다. 구조 마커는 pvaiMissingXmpMetadata, pvaiMissingPdfAIdentifier, pvaiMissingOutputIntent, pvaiMissingIccProfile, pvaiEncryptionPresent, pvaiMissingTrailerId, pvaiMissingXmpDates, pvaiMissingExtensionSchema입니다. 마커 주입으로는 고칠 수 없는 콘텐츠 수준 위반도 보고합니다: pvaiLevelAStructureMissing(태그 구조가 없는 Level A 주장), pvaiJavaScriptPresent, pvaiForbiddenAction, pvaiAdditionalActions, pvaiEmbeddedFilesNonConforming, pvaiLzwUsed, pvaiTransparencyForbidden, pvaiOptionalContentForbidden, pvaiForbiddenAnnotation, pvaiNeedAppearancesTrue, pvaiXfaPresent, pvaiFontNotEmbedded, pvaiUnicodeMappingMissing(폰트에 /ToUnicode가 없는 PDF/A-2u / PDF/A-3u 주장). 더 엄격한 ISO 19005 검사는 pvaiTrappedTrue, pvaiForbiddenActionSubtype, pvaiTransparentColorSpace, pvaiAnnotationDictViolation, pvaiUnembeddedFont, pvaiMixedDeviceColorSpaces, pvaiUndefinedContentOperator, pvaiForbiddenRenderingIntent, pvaiExtGStateTransferFunction, pvaiImageDictionaryViolation, pvaiFormXObjectViolation, pvaiPostScriptOrRefXObject, pvaiAnnotationFlagsViolation, pvaiDeprecatedAction, pvaiMetadataFilterForbidden, pvaiStructElemTypeMissing, pvaiRoleMapMissing을 추가합니다. Round 4는 pvaiHeaderBinaryMarkerMissing(6.1.2), pvaiExternalStreamRef(6.1.7), pvaiOutputIntentScheme(6.2.2), pvaiInfoXmpDateMismatch(6.7.3), pvaiMarkInfoMissing(6.8.2.2 Level A), pvaiAnnotationApDictViolation(6.5.3), pvaiEmbeddedFileMissingAFRelationship(PDF/A-3 부록 E.2), pvaiJpeg2000Violation(PDF/A-2 6.2.8.3)를 추가합니다. Round 5는 pvaiCidFontMissingCidToGidMap(6.3.3.2), pvaiSubsetMissingCharSet(6.3.5), pvaiSubsetMissingCidSet(6.3.5), pvaiWidgetActionForbidden(6.6.1), pvaiOptionalContentAsKey(PDF/A-2 6.9)를 추가합니다. Round 6은 pvaiNeedsRenderingPresent(PDF/A-2 6.4.2), pvaiDestOutputProfileRef(PDF/A-3 6.2.3), pvaiEmbeddedFileMissingUF(PDF/A-3 6.8), pvaiXmpPacketBytesAttr(6.7.5), pvaiAnnotationToggleNoView(PDF/A-2 6.3.2)를 추가합니다. Round 7(v1.73.0)은 Pdfium 객체 모델 계층인 pvaiPdfiumFontNotEmbedded(6.3.4, 폰트별 FPDFFont_GetIsEmbedded)와 pvaiPdfiumUnicodeMapError(6.3.8, 문자별 FPDFText_HasUnicodeMapError)를 추가합니다. 이 두 값은 독립적인 바이트 수준 ValidatePdfACompliance가 아니라 TPdf.ValidatePdfA가 설정합니다. Round 8(v1.74.0)은 pvaiPermissionsViolation(6.1.12), pvaiTransActionForbidden(PDF/A-2 6.5.1), pvaiPdfiumObjectTransparency(PDF/A-1 6.4, FPDFPageObj_HasTransparency 경유)를 추가합니다. Round 9(v1.75.0)는 pvaiIntegerImplementationLimit(PDF/A-2 6.1.13), pvaiBlendModeNotWhitelisted(PDF/A-2 6.2.10), pvaiHexStringOddDigits(6.1.6)를 추가합니다. Round 10(v1.76.0)은 pvaiNameNotValidUtf8(PDF/A-2 6.1.8), pvaiInlineImageLzwForbidden(PDF/A-2 6.1.10), pvaiTrueTypeDifferencesForbidden(6.3.7)을 추가합니다. Round 11(v1.77.0)은 pvaiPdfiumNotDefGlyph(PDF/A-2 6.2.11.8, Pdfium 객체 모델), pvaiWordBreakMissing(Level A 6.8.3.2), pvaiLinkActionMissingTarget(6.6.3)을 추가합니다pvaiMissingXmpMetadata는 카탈로그 /Metadata 키가 없거나 읽을 수 없거나 /Type /Metadata와 /Subtype /XML을 가진 스트림 딕셔너리로 확인되지 않음을 뜻합니다pvaiPdfA1Pdf15Structure는 PDF 1.5 교차 참조 스트림이나 객체 스트림을 담고 있는 PDF/A-1 문서를 보고합니다. 이 구조는 PDF/A-2와 PDF/A-3에서는 여전히 유효합니다pvaiInlineImageLzwForbidden은 모든 PDF/A 파트의 인라인 이미지 필터에 적용됩니다. PDF/A-1은 /LZWDecode를 거부하고, PDF/A-2 / PDF/A-3는 인라인 이미지의 /LZW, /LZWDecode, /Crypt 필터 값도 거부합니다pvaiImageDictionaryViolation은 Image XObject의 /Alternates, /OPI, /Interpolate true 딕셔너리 위반에 더해 /I 또는 /Interpolate 값이 true인 PDF/A-2 및 PDF/A-3 인라인 이미지도 포괄합니다pvaiAnnotationApDictViolation은 /AP 항목에 /N 이외의 키가 들어 있어 잘못된 어노테이션 appearance 딕셔너리와, appearance 딕셔너리가 필요하지만 없는 어노테이션을 모두 포괄합니다pvaiInfoXmpValueMismatch는 대응 XMP 속성이 없거나, RDF 컨테이너 모양이 틀리거나, 유니코드 텍스트끼리 비교했을 때 다르거나, 잘못된 날짜를 담고 있거나, 다른 UTC 시점을 가리키는 Info 값이 하나 이상 존재할 때 보고됩니다Conformance가 실제 PDF/A 수준이고 Issues가 비어 있으면 True를 반환합니다ValidatePdfA는 읽기 전용 검사입니다 — 문서를 수정하지 않으며 반복 호출해도 안전합니다.
PDF를 아카이브 시스템에 넘기기 전에 호출해 비적합 사항을 운영자에게 드러내세요. 이슈
목록이 필요 없는 흔한 "이 문서가 어떤 수준인가?" 확인이라면 더 가벼운
PdfAConformance 속성을 사용하는 편이 좋습니다
Conformance = pacNone이고 Issues 배열이 빈 레코드를 반환합니다
uses System.TypInfo;
var
Outcome: TPdfAValidationResult;
Issue: TPdfAValidationIssue;
begin
Pdf1.FileName := 'C:\Incoming\report.pdf';
Pdf1.Active := True;
Outcome := Pdf1.ValidatePdfA;
Memo1.Lines.Add('Level: ' + GetEnumName(TypeInfo(TPdfAConformance),
Ord(Outcome.Conformance)));
for Issue in Outcome.Issues do
Memo1.Lines.Add('- ' + GetEnumName(TypeInfo(TPdfAValidationIssue), Ord(Issue)));
end;