1.

PDF(.pdf)完全ガイド — ISO 32000 仕様・PDF/A・電子署名・JavaScript セキュリティ

編集
この記事の要点
  • PDF (Portable Document Format) は Adobe Systems が 1993 年に発表し、2008 年に ISO 32000-1 として国際標準化された固定レイアウト文書フォーマット
  • PostScript を簡略化したページ記述言語をベースとし、フォント埋め込みにより環境差なく同一表示できる
  • PDF/A (ISO 19005) は長期保存用、PDF/X は印刷入稿用、PDF/UA はアクセシビリティ対応など派生規格が豊富
  • 暗号化・電子署名・タイムスタンプに標準対応し、契約書・行政文書の主流フォーマットとなっている
  • JavaScript 実行・埋め込みファイル・URL アクションなど攻撃面が広く、CVE 多数。Adobe Reader / Foxit の脆弱性悪用が常套手段
  • マジックナンバーは ASCII で %PDF- (16 進 25 50 44 46 2D) で始まり、末尾に %%EOF を持つ
  • mutool / qpdf / pdftk / Ghostscript / pdfminer.six など、CLI ツールが充実

概要

PDF (Portable Document Format) は、Adobe Systems の John Warnock が「Camelot プロジェクト」として 1991 年に構想し、1993 年に PDF 1.0 として公開した電子文書フォーマットである。OS・閲覧アプリ・プリンタを問わず同一の見た目で文書を表示することを目的に設計され、PostScript のページ記述能力を継承しつつ、ランダムアクセス可能なオブジェクト構造を導入した点が特徴である。2008 年に Adobe は仕様を ISO に寄贈し、現在は ISO 32000-1:2008 / ISO 32000-2:2020 として国際標準化されている。

文書の各ページは「ページオブジェクト」として独立しており、テキスト・ベクター画像・ラスター画像・フォント・注釈・フォームフィールドなどがオブジェクト参照によって組み立てられる。フォントを埋め込むことで受信者の環境にフォントが無くても同一表示が保証されるため、企業の契約書・公的機関の通知・学術論文・電子書籍の事実上の標準フォーマットとなっている。

内部構造とマジックナンバー

PDF ファイルは大きく分けて 4 つの構造を持つ。ヘッダ・ボディ・相互参照表 (xref)・トレーラー (trailer) である。

%PDF-1.7         <-- ヘッダ。マジックナンバー + バージョン
%ÃÃÃÃ          <-- バイナリマーカー (高位ビット 8 バイト)
1 0 obj          <-- オブジェクト本体
<< /Type /Catalog /Pages 2 0 R >>
endobj
...
xref             <-- 相互参照表 (各オブジェクトのバイト位置)
0 5
0000000000 65535 f
0000000015 00000 n
trailer          <-- ルートオブジェクトの位置情報
<< /Size 5 /Root 1 0 R >>
startxref
1234
%%EOF

マジックナンバーは ASCII の %PDF- (16 進 25 50 44 46 2D) で、直後にバージョン番号 (例 1.7) が続く。file コマンドや MIME 判定はこの先頭バイトを参照している。末尾は必ず %%EOF で終わるが、増分更新 (Incremental Update) で署名後に追記された場合は複数の xref/trailer/%%EOF が連なる。

圧縮ストリーム (FlateDecode / DCTDecode / JBIG2Decode) を用いてオブジェクトを圧縮する。テキスト抽出が難しい一因がこの多段デコードと、フォントのカスタムエンコーディング (ToUnicode CMap の有無) にある。

主な用途

  • 契約書・申込書: 電子署名 (PAdES) とタイムスタンプで原本性を担保。e-Tax / GビズID 等の行政手続も PDF が中核。
  • 論文・技術文書: arXiv、IEEE Xplore、IPA 公開文書はすべて PDF。LaTeX → pdflatex / lualatex / xelatex で生成。
  • 印刷入稿: PDF/X-1a / PDF/X-4 で CMYK・トンボ・裁ち落としを規格化。Adobe InDesign からの書き出しが定番。
  • 長期保存: PDF/A-1 / A-2 / A-3 で外部リソース禁止・フォント埋め込み必須化。国立公文書館や ISO アーカイブの標準。
  • 電子書籍・カタログ: 紙面レイアウトをそのまま再現したい教材・パンフレット・取扱説明書で主流。
  • 帳票出力: 業務アプリの請求書・見積書・納品書出力。wkhtmltopdf / Puppeteer / TCPDF / FPDF で動的生成。

関連形式との比較

形式レイアウト編集容易性標準化主な用途
PDF固定低いISO 32000配布・印刷・保存・契約
docx可変 (再フロー)高いISO/IEC 29500編集中の原稿
HTML可変 (レスポンシブ)高いW3CWeb 表示
EPUB可変 (リフロー型)IDPF/W3C電子書籍
PostScript (.ps)固定Adobe印刷の前駆フォーマット (現在は PDF に置換)
XPS固定ECMA-388Microsoft の対抗規格 (普及せず)

編集・パーサ・ツール

# テキスト抽出
pdftotext input.pdf output.txt
mutool draw -F txt input.pdf

# 結合 / 分割 / 抜き出し
qpdf --empty --pages a.pdf b.pdf -- merged.pdf
qpdf input.pdf --pages . 1-5 -- first5.pdf
pdftk input.pdf cat 1-3 5 output out.pdf

# 圧縮 / 再エンコード
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.7 -dPDFSETTINGS=/ebook \
   -dNOPAUSE -dBATCH -sOutputFile=small.pdf input.pdf

# メタ情報の確認
pdfinfo input.pdf
exiftool input.pdf

# Python での解析
python -c "import pdfminer.high_level as p; print(p.extract_text('a.pdf'))"

注意点・落とし穴

  • JavaScript 攻撃面: PDF は OpenAction / JavaScript アクションを持てるため、悪意のあるサンプルは閲覧だけで RCE につながる CVE が多発した (CVE-2018-4990 / CVE-2018-15981 など)。閲覧ソフトの自動更新と JS 無効化が基本。
  • 埋め込みファイル: PDF は任意バイナリを内包できるため、マルウェアの運搬手段になり得る。pdfid / peepdf/EmbeddedFile/Launch アクションの有無を検査する。
  • フォントの埋め込み忘れ: PDF/A 化や印刷入稿で頻発。標準 14 フォントしか含まれていない PDF を別環境で開くと字形が崩れる。pdffonts で確認。
  • OCR 未適用のスキャン PDF: 画像のみで構成され検索不能。ocrmypdf や Adobe Acrobat の OCR で透明テキスト層を付与する。
  • 電子署名の検証: 増分更新で署名後に内容を改変できる構造上の弱点があり、2019 年に「Shadow Attack」「Incremental Saving Attack」が公表された。最新の検証ソフトでないと検知できない。
  • テキスト抽出時の文字化け: ToUnicode CMap が無いフォントは抽出すると意味不明な PUA 文字になる。日本語 PDF で頻発。

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. PDF(.pdf)
  2. CSV(.csv)
  3. Markdown(.md)
  4. TXT(.txt)
  5. DOCX(.docx)
  6. XLSX(.xlsx)
  7. PPTX(.pptx)
  8. TSV(.tsv)
  9. RTF(.rtf)
  10. ODT / ODS / ODP(.odt / .ods / .odp)

最近更新/作成されたページ