実装して学ぼう!PDFファイルの構造とその書き方読み方PDFのファイル構造を理解すると、テキストエディタでも直接PDFファイルを作ることができるようになります。このエントリーではPDFファイルの基礎要素を説明し、簡単なPDFファイルを例にしてファイル構造を説明します。テキストを渡すとPDFファイルを吐いてくれる簡単なプログラムや、PDFを読み込んで簡単な解析をするプログラムを書いてみます。日本語を含むPDFを生成するプログラムグラフィックスPDFを読むプログラムあとがきまえがき1990年代前半、アドビシステムズは、どのプラットフォームやデバイスでも文書を確実に表示・共有できることを目的としてPDFファイルフォーマットを開発しました。無償で配布されるようになると次第に人気を集め、今となっては、PDFは最も頻繁にやりとりされるファイルフォーマットの1つとして、確固たる地位に登りつめました。官公庁や教育機関における資料や報告書、企業の発表資料、雑誌や書籍への入稿、広告会社におけるファイルのやりとり、学会でのプレゼンテーション、論文、標準規格の仕様書など、PDFファイルフォーマットの用途は多岐にわたります。32000-1:2008として国際規格化されています。アドビシステムズが、1993年にPDFファイルの仕様を公開し、PDFファイルの読み書きするソフトの公開や販売を制限しなかったことが、今日のPDFファイルの人気に繋がっていると言ってもよいでしょう。PDFファイルの仕様書は大きく、素人が勉強するには理解しやすいものではありません。エンジニアの中でも、PDFファイルに対して積極的に興味を持つ人はほとんどいません。PDFファイルはバイナリファイルであり、適当なエディタで開いても謎のバイナリ列が表示されるだけということも、「よし、理解しよう」という気にならない原因となっていると思います。このエントリーでは、PDFのファイル構造を理解するための基礎的な内容を丁寧にお伝えしたいと思います。PDFファイルに興味があるが、どこから手を付ければいいかわからない人や、PDFファイルをエディタで直に書けるようになりたい人、あまり興味はないけどPDFのファイル構造がどうなっているか雰囲気でも掴みたい人など、どんな人でも歓迎です。PDFは数限られたソフトが出力することを許された闇に満ちたバイナリフォーマット?いいえ、全く違います。ある程度単純なPDFなら、ほんの100行程度のコードで生成できるのです。このエントリーは、次の書籍を元に書いています。単行本(ソフトカバー)PDFについて全くの初心者だった私が手にしたこの書籍は、PDFファイルの基本的な用語や定義を丁寧かつ正確に解説した上で、サンプルを交えながらPDFの構造について説明しています。私のこの記事でPDFファイルに興味を持たれた方は、書籍の購入をお薦めします。32000-1:2008にて定義されており、ISO標準となっています。ISOのドキュメントの入手にはお金がかかりますが、アドビシステムズはISOに認証された仕様書のコピーを無料で公開しています。Connection750ページもあって全て読むのは大変ですが、丁寧に書かれていて、なんといっても正確です。この記事でPDFに興味を持たれた方や、PDFを扱うソフトウェアを書く場合は参考にしてください。このドキュメントを、以下では『仕様書』として扱います。それでは、PDFのファイル構造を理解する旅を、共に始めましょう。オブジェクトプログラミング言語の基礎を勉強するとき、まずはその言語で使える数字や文字列、変数や関数の理解から始めますよね。PDFファイルでもその構造を成す基礎要素を理解することが、まず初めの第一歩となります。ストリームがあります。PDFのオブジェクトを順番に見て行きましょう。PDFにはbooleanがあります。truefalse小文字で表します。JavaScriptやRubyなどと同じです。PDFにはnullがあります。null小文字で表します。PDFの数字には整数と実数があります。整数は次のようなものです。つけることができます。実数は次のようなものです。文字列は、ダブルクォート"やシングルクォート'ではなく、丸括弧で囲って表します。これは他の言語からするとやや異色ですね。同様に、PDFの文字列の中の丸括弧は、エスケープします。\(world\))エスケープ文字自身も、エスケープします。丸括弧が対応しているときは、エスケープしてもしなくても構いません。\(.)丸括弧はしばしば対応して出てくるので、PDFファイルを直に書いているときは特にエスケープする必要はないでしょう。(ネストしている可能性もあります)、丸括弧は常にエスケープする処理のほうが、PDF生成プログラムを書きやすいでしょう。文字列の表現の仕方にはもう1通りあります。16進数で表現する方法です。あいうという文字列を表現すると<6162632082a082a282a4>となります。中に、スペース無しの16進数表現で記述します。この不等号の中でのスペースや改行は無視されます。別にSJISエンコーディングでなくても構いません。あいうを表す文字列は<0061006200630020304230443046>となります。このリテラルだけではこれを解釈するためのエンコーディングは分からない、どういう文字列がエンコードされたものかは分からないということです。文字列のエンコーディングを指定する方法は、日本語の扱い方にて詳しく扱います。PDFには「名前」と呼ばれる、他の言語にはない特別な要素があります。