PDFファイルをテキスト形式で作成する
PDF(Portable Document Format)は、以下の多くの優れた特徴により、私たちの日常生活や仕事の中で欠かせないツールとなっています。
- 単一ファイル形式: テキスト、画像、フォント、色空間、さらにはマルチメディアファイルやJavaScriptまでも、1つのPDFファイル内に含めることができます。
- 印刷品質の保持: 高品質な印刷を目的としたフォーマットとしても優れており、画像やレイアウトの崩れを防ぎます。
- プラットフォームに依存しない: Windows、Macintosh、Linux、さらにはスマートフォンやタブレットといったデバイスにおいても、同じ見た目とレイアウトで開くことができ、異なる環境間での互換性が高まります。
- 高速な表示と軽量性: 表示の速度が非常に速く、特にテキスト主体のPDFは軽量であるため、スムーズに読み込むことが可能です。
- 高いセキュリティ機能: パスワード保護や暗号化、編集制限を設定できます。
上記の魅力的な特徴を持つPDFですが、そのファイルの構造はあまり知られていません。日常的にPDFファイルをテキスト形式で自作することは無理ですが、簡単なPDFファイルを1から作成することで、PDFファイルの仕組みを理解できるようになるでしょう🤗。
Minimal PDF
PDFの仕様は、国際標準化機構(ISO)の規格「ISO 32000」で定められています。
- PDF 1.7: ISO 32000-1で、2008年に制定されました。
- PDF 2.0: ISO 32000-2で、2020年に制定されました。
PDF 1.7の仕様書のAnnex Hに、Minimal PDFとしてテキスト形式で作成する最もベーシックなPDFファイルの例が記載されています。 Minimal PDFは、何も書かれていない白紙のPDFとなりますが、まずは一度自作してみて、以下の基本的なPDFのファイル構造を理解しましょう😤。
- ファイルヘッダー: PDFファイルの先頭に書かれ、「これはPDFファイルだよ」って教えてくれます。例えば、「%PDF-1.7」 みたいな感じで、PDFのバージョンが記載されています。
- ファイルボディー: PDFの本体です。テキスト、画像、フォントや色空間などがオブジェクトごとに(通常は)圧縮されて入っています。
- クロスリファレンステーブル: 「このオブジェクトはここにあるぞ」ってデータの場所を教えてくれます。
- ファイルトレーラー: PDFファイルの最後にかかれ、「ファイルの終わりだよ」って教えてくれるのと同時に、「クロスリファレンステーブルはここにあるぞ」って教えてくれます。
Minimal PDFのオブジェクトの一覧
以下にMinimal PDFのオブジェクト一覧を表にまとめます。
各オブジェクトの詳細については、PDF 1.7の仕様書を確認してください。オブジェクトの説明が仕様書のどこに書かれているか分かりやすいように章番号を表に記載します。
PDF 1.7の仕様書のAnnex HのMinimal PDFは、ほとんど最低限のPDFファイルですが、完全に最低限ではありません。
通常、省略することが可能なオブジェクト、アウトライン辞書(しおり)およびProcedure Set配列を含むリソース辞書が含まれています。これらのオブジェクトは、より現実的なPDFファイルを作成するために追加されています。
完成例
ソース
%PDF-1.7
1 0 obj
<< /Outlines 2 0 R /Pages 3 0 R /Type /Catalog >>
endobj
2 0 obj
<< /Count 0 /Type Outlines >>
endobj
3 0 obj
<< /Count 1 /Kids [4 0 R] /Type /Pages >>
endobj
4 0 obj
<< /Contents 5 0 R /MediaBox [0 0 595 842] /Parent 3 0 R /Resources 6 0 R /Type /Page >>
endobj
5 0 obj
<< /Length 25 >>
stream
%…Page-marking operators…
endstream
endobj
6 0 obj
<< /ProcSet 7 0 R >>
endobj
7 0 obj
[/PDF]
endobj
xref
0 8
0000000000 65535 f
0000000012 00000 n
0000000082 00000 n
0000000132 00000 n
0000000194 00000 n
0000000303 00000 n
0000000390 00000 n
0000000431 00000 n
trailer
<< /Root 1 0 R /Size 8 >>
startxref
458
%%EOF
Simple Graphics Example
テキストを記述する方法は少し複雑なため、最初はベクター形式のグラフィックデータを記述する方法を勉強すると良いと思います。
ベクター形式のデータは、Contents streamに直接記述することで描画することができます。記述方法の詳細は、PDF 1.7の仕様書の「8 Graphics」に説明されています。
既存のPDFファイルもベクター形式のグラフィックデータは、Contents streamに直接記述されていますが、圧縮されバイナリーデータとなっているためテキストエディターで確認することができません。
次の記事では、バイナリーデータを解凍して、Contens streamに記述されているベクター形式のグラフィックデータを取得したいと思います。
完成例
ソース
%PDF-1.7
1 0 obj
<< /Outlines 2 0 R /Pages 3 0 R /Type /Catalog >>
endobj
2 0 obj
<< /Count 0 /Type Outlines >>
endobj
3 0 obj
<< /Count 1 /Kids [4 0 R] /Type /Pages >>
endobj
4 0 obj
<< /Contents 5 0 R /MediaBox [0 0 595 842] /Parent 3 0 R /Resources 6 0 R /Type /Page >>
endobj
5 0 obj
<< /Length 203 >>
stream
150 250 m
150 350 l
S
4 w
[4 6] 0 d
150 250 m
400 250 l
S
[] 0 d
1 w
1.0 0.0 0.0 RG
0.5 0.75 1.0 rg
200 300 50 75 re
B
0.5 0.1 0.2 RG
0.7 g
300 300 m
300 400 400 400 400 300 c
b
endstream
endobj
6 0 obj
<< /ProcSet 7 0 R >>
endobj
7 0 obj
[/PDF]
endobj
xref
0 8
0000000000 65535 f
0000000012 00000 n
0000000082 00000 n
0000000132 00000 n
0000000194 00000 n
0000000303 00000 n
0000000557 00000 n
0000000598 00000 n
trailer
<< /Root 1 0 R /Size 8 >>
startxref
625
%%EOF