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)、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 要素が Table 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 配列でヘッダーを参照する状態。解決可能なエントリの横にある単独のぶら下がりエントリは、権威ある検証器に合わせて容認されます) を追加します。v1.81.0 では §7.6 のリスト入れ子検査 pvuaiListStructureInvalid (L コンテナの外側にある LI、または LI 項目の外側にある Lbl/LBody。入れ子リストと Note/BibEntry 内の Lbl は受け入れられます) を追加します。v1.82.0 では §7.1 の RoleMap 解決検査 pvuaiRoleMapRemapsStandard (標準構造タイプを再定義する RoleMap エントリ) と pvuaiRoleMapUnresolved (使用されている非標準構造タイプに RoleMap エントリがない、またはそのチェーンがぶら下がりか循環している。標準タイプに到達する間接チェーンは受け入れられ、未使用の RoleMap エントリは決して判定されません) を追加します。v1.83.0 では §7.4.4 の見出しモデル検査 pvuaiHeadingModelMixed (汎用の H タグが番号付きの H1..Hn 見出しと混在) と pvuaiHeadingMultipleInNode (複数の子 H 見出しを持つ構造ノード) を追加します。v1.84.0 では §7.1 の未タグコンテンツ検査 pvuaiUntaggedContent (マーク済みコンテンツ ID によってページの構造ツリーに帰属せず、Artifact ともマークされていない、描画されるテキストまたは画像オブジェクト。ありふれた装飾を誤検知しないよう、素のパスオブジェクトは検査対象外です) を追加します。v1.85.0 では §7.15 の動的 XFA 検査 pvuaiXfaDynamic (XFA 構成が dynamicRender を required に設定) を追加し、あらゆる XFA を対象とする pvuaiXfaPresent を廃止します (静的 XFA は適合であり、列挙値は残りますが発生しなくなります)。v1.85.1 からは §7.18.3 の pvuaiMissingTabsOrder 検査がページごとに実行され、注釈を持つすべてのページが自身のディクショナリに /Tabs /S を必要とします。v1.86.0 では §7.21.6 の TrueType エンコーディング検査 pvuaiTrueTypeEncodingInvalid (非シンボリック TrueType が Encoding を欠く、または直接あるいは BaseEncoding 経由でも MacRomanEncoding でも WinAnsiEncoding でもない) と pvuaiSymbolicTrueTypeEncoding (シンボリック TrueType が非標準の Encoding 名を持つ。適合文書では標準エンコーディングのフォントがシンボリックと誤記されることが日常的なため、標準名は容認されます) を追加します。v1.87.0 では §7.21.3 のコンポジットフォント検査 pvuaiCidSystemInfoMismatch (埋め込み CMap と子孫 CIDFont が Registry/Ordering で不一致、または CIDFont の Supplement が CMap の値を超過)、pvuaiCMapNotEmbedded (名前で参照された CMap が Table 118 の定義済み CMap ではない)、pvuaiCMapWModeMismatch (埋め込み CMap のディクショナリ WMode がストリーム内容と異なる。判定できるのはバイト読み取り可能な非圧縮 CMap ストリームのみ) を追加し、pvuaiCidFontMissingCidToGidMap を Identity 以外の CIDToGIDMap 名にもフラグを立てるよう拡張します。v1.93.0 では Pdfium オブジェクトモデルのレイヤーとして、ライブの Pdfium オブジェクトツリーから計算される 3 つの正確なフォント単位 / 文字単位の問題を追加します: pvuaiPdfiumFontNotEmbedded (§7.21.4、ページが実際に使用するフォントが FPDFFont_GetIsEmbedded により非埋め込み)、pvuaiPdfiumUnicodeMapError (§7.21.7、ページの文字が FPDFText_HasUnicodeMapError により不正な Unicode マッピングを持つ)、pvuaiPdfiumNotDefGlyph (§7.21.8、文字が Unicode 0 / .notdef に描画される)。これらはバイトレベルの pvuaiFontNotEmbedded / pvuaiFontMissingToUnicode ヒューリスティック (文書全体でゼロ埋め込みまたは /ToUnicode なしのシグナルでのみ発火) を補完します。この走査は 3 つのレベル (ページループ、オブジェクトごとのループ、文字走査) で短絡します。v1.94.0 では節ごとの再監査による 6 つの第 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 をフラグします (キー欠落の検査は存在しないキーしか捉えませんでした)。v1.96.0 では pvuaiAnnotationFlagsViolation (§7.18.1、Hidden / Invisible / NoView を持つ除外対象外の注釈) と pvuaiActionTargetMissing (§7.18.5、ターゲットキーを欠く GoToR / URI / SubmitForm アクション) を PDF/A 検証器から移植し、構造ツリー統合におけるページ間の ParentIndex 再配置バグと、間接参照や配列の値で早期終了していた RoleMap パーサーを修正しますConformance が実際の PDF/UA レベルであり、Issues が空の場合に True を返しますPDF/UA-2 の検証ではさらに、4 桁の pdfuaid:rev、実効的な PDF 2.0、A/W/S 注釈のタブ順序、XFA の不在、空でないオプショナルコンテンツ構成名、PDF 2.0 で廃止された Sound / Movie 注釈の不在、明示的に番号付けされた H1 から Hn までの見出し構造タイプが必要です
v3.73.0 以降、Artifact でないページテキストや構造の Title、Alt、ActualText、Expansion 文字列が有効な実効 /Lang 宣言を欠く場合、問題集合には pvuaiNaturalLanguageUncovered も含まれ得ます
v3.74.0 以降、ページの構造ツリーに主張される MCID を Artifact ページオブジェクトが持つ場合 (パスベースのページ区切り Artifact を含む)、問題集合には pvuaiArtifactInStructureTree も含まれ得ます
v3.75.0 以降、Unicode マッピングの問題は 1 回のオブジェクトスコープの InspectPdfUaUnicodeCoverage パスから得られます。有効な ActualText はその由来するテキストオブジェクトの文字だけをカバーし、Artifact と PDFium が生成した文字は意味的なカバレッジから除外されます
ValidatePdfUa は読み取り専用の検査です — 文書を変更せず、繰り返し呼び出しても安全です。
PDF をアーカイブシステムやアクセシビリティチェッカーへ引き渡す前に呼び出せば、
不適合をオペレーターに可視化できます。問題リストを必要としない
「これは PDF/UA-1 か」という定番の確認には、より軽量な
PdfUaConformance プロパティが適しています
Conformance = pucUnknown で Issues 集合が空のレコードが返りますpvuaiSuspectsTrue をフラグするのは、/MarkInfo に明示的な /Suspects true がある場合だけです。/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;