fbpx

PDFってこうなってる? 実践でPDFの内部構造を学ぼう Part5:Hello WorldのPDFを作ろう

「Part 1: PDFを理解するための第一歩」で、私はPDFファイルを構成するさまざまなオブジェクトについて説明しました。その中で言及したのがストリームオブジェクトです。ストリームオブジェクトは、PDFページの見た目を記述する命令を全て含んでいます。この記事の最後までに、私たちは「Hello World」のPDFを作成できるようになります。そのためには、PDFドキュメントにテキストを挿入するためのストリームオブジェクトを使う必要があります。
Part5:Hello WorldのPDFを作ろう

どんな古いPDFでも、テキストエディタで開けば、表示されるテキストの大部分がストリームオブジェクト内に含まれていることがわかります。ストリームのフォーマットは他のオブジェクトとは少し異なり、ディクショナリーで始まります。このディクショナリーには、ストリームの長さをバイト数で示す/Lengthエントリが必要です。ストリームの長さとは、streamキーワードとendstreamキーワードの間(最後の改行文字を除く)の全てを指します。通常、PDFを開いた時点ではストリーム内のデータは圧縮されています。その圧縮形式は、ストリームの主ディクショナリー内の/Filterキーで確認できます。

例えば:

				
					10 0 obj<</Length 40 /Filter /FlateDecode>>
stream

…圧縮された内容…

endstream
endobj
				
			

この内容を解凍すると、一連の命令が現れます。これらの命令は、PDF内の全コンテンツを生成するためのコマンドなのです。以下は解凍後のストリームの内容です:

				
					vBT
/F1 24 Tf
175 720 Td
(Hello World!)Tj
ET
				
			

BTはテキストの開始を、ETはテキストの終了を意味します。その間の部分では、フォント、位置、表示するテキストを設定しています。命令はTf、Td、Tjです。これらの命令に必要な値は、命令の前に書かれます。例えば、最初の命令Tfにはフォントの参照(/F1、これについては後で説明します)とフォントサイズ24が必要です。Tdオペレータはテキストの位置を設定します。1番目のパラメータは左からの単位、2番目のパラメータは下からの単位を表します。これらの単位は面白いもので、プリンタやモニタなど実際のデバイスにレンダリングされる時だけ、現実世界の座標に変換される論理的な座標系に関連しています。これにより、異なる出力媒体でもテキストのサイズと位置を一定に保つことができるのです。最後にTj命令があり、カッコ内の文字列がPDFドキュメントに描画されます。

これをPDFドキュメントに追加する前に、/F1参照を解決しなければなりません。ストリーム内では、ストリーム外で使うようなオブジェクト参照(例: 10 0 R)は使えません。/F1をオブジェクトにマッピングし、それを/Resources辞書で利用可能にする必要があります。このリソース辞書は、ストリームオブジェクトを指す/Contentsエントリと関連付けられています:

				
					3 0 obj
<</Type /Page /Parent 2 0 R /Resources 4 0 R /MediaBox [0 0 500 800] /Contents 7 0 R>>
endobj
4 0 obj
<</Font 5 0 R>>
endobj
5 0 obj
<</F1 6 0 R>>
endobj
6 0 obj
<</Type /Font /Subtype /Type1 /BaseFont /Helvetica>>
endobj
7 0 obj
<</Length 40>>
stream
BT
/F1 24 Tf
…..
				
			

ここでは/Pageオブジェクトを使っています。ページの/Contentsエントリは、テキストを描画するストリームオブジェクトを指しています。ストリームは/F1オブジェクトが何を指しているのかを知る必要があります。/Resources辞書は4 0 Rにあり、/Fontエントリのみを含んでいます。これが/F1のマッピング先を指しています。5 0 objを見ると、/F1がHelveticaというデフォルトフォントの一つを表すオブジェクトにマッピングされていることがわかります。一見回りくどく感じるかもしれませんが、実はPDFビューアの速度向上に役立っています。フォントを読み込む代わりに参照を保持しておき、そのフォントが実際に使われない(そのページが表示されない)場合は読み込む必要がないのです。

これらを全て組み合わせることで、Hello_World.pdf ドキュメントを作成する方法が得られます。ここでは構造と内容がより分かりやすく記載しています。

				
					%PDF-2.0

% カタログオブジェクト
1 0 obj
<</Type /Catalog /Pages 2 0 R>>
endobj

% ページツリーオブジェクト
2 0 obj
<</Type /Pages /Kids [3 0 R] /Count 1>>
endobj

% ページオブジェクト
3 0 obj
<</Type /Page /Parent 2 0 R /Resources 4 0 R /MediaBox [0 0 500 800] /Contents 6 0 R>>
endobj

% リソースオブジェクト
4 0 obj
<</Font <</F1 5 0 R>>>>
endobj

% フォントオブジェクト
5 0 obj
<</Type /Font /Subtype /Type1 /BaseFont /Helvetica>>
endobj

% コンテンツストリームオブジェクト
6 0 obj
<</Length 44>>
stream
BT
/F1 24 Tf
175 720 Td
(Hello World!) Tj
ET
endstream
endobj

% クロスリファレンステーブル
xref
0 7
0000000000 65535 f 
0000000009 00000 n 
0000000056 00000 n 
0000000111 00000 n 
0000000212 00000 n 
0000000250 00000 n 
0000000317 00000 n 

% トレーラー
trailer
<</Size 7 /Root 1 0 R>>

% クロスリファレンステーブルの開始位置
startxref
406

%%EOF

				
			

PDFアプリ開発ツール(SDK)をお探しのみなさま、効率のよい開発作業のためにJPedal、BuildVu、JDeliがきっとお役に立つことと思います。
これら3製品は無料で試用していただけますので、まずはお試しのうえ、ぜひ導入をご検討ください。
JPedal、BuildVu、JDeliのシステム開発やプログラミング、無料トライアルの情報は下記の各製品のトライアルページをご覧ください。技術的なことから費用面まで、ご質問・ご相談も各製品ページの問合せボタンからお寄せください。

    Facebook
    Twitter
    Email
    公式ブログロゴ

    製品に関する記事や開発者のブログ

    PDF用語集

    この記事ではPDF関連の一般的な用語を網羅し、それぞれの定義を解説します。

    PDFメタデータとは?開発者が知っておくべき基礎知識

    PDFファイルを扱う際、「メタデータ」という言葉を耳にすることが多いでしょう。メタデータとは、ドキュメントに関する情報を指し、ファイルの作成者や作成日、使用されたソフトウェアなど、ドキュメントを説明する情報が含まれています。この記事では、開発者向けにPDFメタデータの基本からその利用方法までをわかりやすく解説します。

    PDFを最適化して軽量化!使われないオブジェクト削除で得られる驚きの効果

    Javaでシステム開発を行う中で、PDFファイルのサイズが予想以上に大きくなり困った経験はありませんか?その原因の一つに「使われないオブジェクト」の存在があります。今回は、Javaの開発者でJPedalのプロダクトマネージャーのJacob氏の記事を元に、使われないオブジェクトとは何か、その削除方法、削除によるファイルサイズの削減効果、そしてその他のメリットについて解説します。

    PDFファイルを扱うシステム開発・ウェブ開発に役立つ

    開発者向けPDF入門ガイド

    開発者向けPDF入門ガイド

    PDFの基礎から応用まで開発者のための入門ガイド2024年版

    PDF の仕様や活用方法など、開発者に必要な情報がコンパクトにまとめました。初めてPDFを扱う開発者にも分かりやすく、基礎から応用までカバーしているため、PDF のポテンシャルを最大限に引き出し、アプリケーション開発やドキュメント管理の効率化を図るための手引きとなるでしょう。技術的な側面に興味がある開発者だけでなく、ビジネスでPDFを有効活用したい方にもおすすめの一冊です。

    MENU
    PAGE TOP