AI が PDF を読むときに失われる情報
PDF Association は 2026 年、「FAQ: AI and PDF」を公開しました。AI システムが PDF を取り込むときにどの情報を失ってはいけないかを 29 問で述べたページで、PDF Agent Stack が「PDF を Markdown に変換して LLM に渡す」のではなく「MCP で構造を読む」形を取っている理由と、ほぼ重なっています。このページでは、FAQ が AI 開発者に求めていることを 10 項目に整理し、PDF Agent Stack のどのツールがそれに答えるかを示します。
出典について
PDF Association, "FAQ: AI and PDF", https://pdfa.org/faq-ai-and-pdf/(2026 年 10 月 12 日閲覧)。ページに著者名と公開日の記載はありません。以下の「FAQ の主張」欄は原文の要点を整理したもので、引用ではありません。
FAQ が否定している 3 つの手順
FAQ は、現在の RAG パイプラインでよく見る次の手順を、いずれも情報が失われる手順として否定しています。
| よく見る手順 | FAQ の指摘 | 失われる情報 |
|---|---|---|
| PDF を Markdown / HTML / プレーンテキストに変換してから渡す | 変換は推奨しない | 結合セル・レイヤー・デジタル署名・上付き文字の意味。幻覚の原因になる |
| ページごとに切って渡す | ページ単位で処理しない。ただし出典のページ参照は保つ | ページをまたぐ段落・表・脚注 |
| とりあえず OCR する | born-digital の文書はテキスト抽出のほうが正確 | ActualText・合字の Unicode 対応・注釈内の文字。OCR は見えている文字しか拾わない |
PDF Agent Stack はこの 3 つをしません。pdf-reader-mcp はファイルを変換せず、response_format: "json" で構造(タグの役割・座標)を保ったまま返します。pdf-read Skill は、search_text で絞ったページを read_text で読むときに前後 1 ページを加えて読み、ページの境目で切れた箇所を Read Report に書きます。OCR は持たず、テキストとして読めないページだけを render_page で画像にして視覚モデルに渡します。
10 の要求と、答えるツール
| # | FAQ の主張 | PDF Agent Stack での答え |
|---|---|---|
| 1 | ページ内容・テキスト・画像・ブックマーク・レイヤー・XMP メタデータ・注釈・添付ファイルの全部を取り込む | pdf-reader-mcp の read_text / read_images / inspect_annotations / inspect_signatures に加え、v0.16.0 の inspect_catalog がブックマーク(/Outlines)・レイヤー(/OCProperties)・添付(/EmbeddedFiles)・XMP 本体を列挙します |
| 2 | Tagged PDF の構造ツリー(読み順・表・代替テキスト・言語)を先に使い、推論は後回しにする | extract_structured_text / extract_tables / inspect_tags。pdf-read Skill はタグ付き文書ではまず extract_structured_text で読みます |
| 3 | XMP の PDF/UA 宣言を「タグ構造を信頼してよい合図」として使う | summarize が declaredConformance.pdfuaid を読み、宣言があれば extract_structured_text で読むことを先に勧めます。宣言と実態の照合は pdf-verify-mcp の validate_conformance です |
| 4 | W3C TDMRep など権利表明メタデータを読み、著者の意思を尊重する | inspect_catalog と summarize が tdm:reservation / tdm:policy を書いてあるとおりに返します。従うかどうかの判断は呼び出し側に残します |
| 5 | born-digital の文書はテキスト抽出、OCR は最後の手段 | read_text がページごとに extracted / no_text_layer / not_extractable / not_observed のどれかを返します。空の結果を「文字が無い」とは読みません |
| 6 | Markdown / HTML への事前変換をしない | 変換するツールがありません。各ツールが構造を保った JSON を返します |
| 7 | ページ単位で切らない。出典のページ参照は保つ | extract_tables はページをまたぐ表を 1 つとして返します。pdf-read Skill は search_text で絞ったページの前後 1 ページを加えて読みます |
| 8 | 注釈を種類ごとの意味で扱う。黒塗り(Redact)注釈が残っていれば黒塗りは未完了 | inspect_annotations が Subtype ごとに数えます。pdf-verify-mcp v0.30.0 の evaluate_policy は Redact 注釈が残っていると POL-CAUTION-REDACT-PENDING を firedRules に含め、pdf-trust が推奨アクションを書きます |
| 9 | 破損した PDF から回復できるものは回復する。処理系ごとに回復結果が違うことに注意 | @normativepdf/recover が相互参照表を組み直して読みます。組み直したときは、すべての判定の先頭に scope.reconstructed: true が付きます |
| 10 | 悪意ある PDF(マルウェア・フィッシング・AI への poisoning)に備える。署名検証が助けになる | pdf-verify-mcp の verify_signatures / verify_integrity に加え、v0.30.0 の evaluate_policy が ISO 32000-2 §12.8.7 の数え方で JavaScript・Launch・リモート Go-To・SubmitForm の件数を facts.content に出し、1 件以上あれば POL-CAUTION-ACTIVE-CONTENT を firedRules に含めます |
観測と判定を分けていること
FAQ の要求に答えるとき、PDF Agent Stack は 2 つのサーバーで役割を分けています。pdf-reader-mcp はファイルに入っているもの(テキスト・タグ・XMP の宣言・注釈)をそのまま返し、pdf-verify-mcp はそれが規格と署名の条件を満たすかを判定して 4 値で返します。
- pdf-reader-mcp は、XMP に
pdfuaid:part = 1と書いてあることを宣言として返します。PDF/UA に適合しているとは言いません。 - pdf-verify-mcp は、Redact 注釈が残っていることから「黒塗りの対象だった内容がファイルに残っている」と判定し、
use_with_cautionを返します。残っている内容そのものは取り出しません。 - どちらも、読めなかったものを「無かった」とは書きません。
inspect_catalogの各項目はabsent(キーが無い)とunreadable(キーはあるが値に届かない)を分け、evaluate_policyのfacts.contentが取れなかったときは「数えていない」と書いて 0 とは書きません。
この分け方の背景は 全体構成と責務 にあります。
まだ答えていないこと
- FAQ が挙げる「処理系ごとに回復結果が違う」ことの計測(他の実装との差分比較)は行っていません。
- ISO 32000-2 §12.8.7 Table 264 のうち、AlternateImages・ExternalStreams・TrueTypeFonts・ExternalRefXobjects・ExternalOPIdicts・NonEmbeddedFonts・DevDepGS_* は数えていません。
- スクリプトの中身は読みません。言えるのは「ある」「何バイトある」までです。
関連ページ
- 全体構成と責務 — 観測・判定・生成・規範を分ける理由
- pdf-read — 読み方(構造ツリー / 検索して絞る / 画像にする)の選び方と Read Report
- pdf-trust — 受入監査と Trust Report
- ISO 仕様書の読み方