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 Example 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 Annex 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) を追加します。これらは TPdf.ValidatePdfA が設定するものであり、スタンドアロンのバイトレベルの ValidatePdfACompliance ではありません。Round 8 (v1.74.0) では pvaiPermissionsViolation (6.1.12)、pvaiTransActionForbidden (PDF/A-2 6.5.1)、pvaiPdfiumObjectTransparency (FPDFPageObj_HasTransparency 経由の PDF/A-1 6.4) を追加します。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 以外のキーを含む不正な注釈外観ディクショナリと、外観ディクショナリが必要なのに持たない注釈の両方をカバーしますpvaiInfoXmpValueMismatch は、対応する XMP プロパティが存在しない、RDF コンテナの形が違う、Unicode テキストとして異なる、不正な日付を含む、異なる UTC 時刻を表す、のいずれかである Info 値が 1 つ以上あることを報告します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;