株式会社インターワーク

PDFファイルに画像はどのように格納されていますか?

PDFファイル内の画像がどのように保存されているのか、疑問に思ったことはありませんか?この記事では、PDF内のラスター画像とベクター画像の違い、PDFの画像の保管方法、そしてPDFの画像の抽出方法について解説します。

(更新:
PDFファイルに画像はどのように格納されていますか?

マークは1999年からJavaとPDFに携わっており、NetBeansの大ファンです。カンファレンスでの講演が趣味です。今回は、PDFファイルに表示される画像はどのように格納されているのかを説明します。例えばMicrosoft WordでPNGやJPEGの画像を配置して、PDFファイルに書き出したときどのように画像ファイルは処理されているのでしょうか?

私がPDFファイル形式を学んでいたとき、PDFでは画像が非常に複雑なトピックであることが分かりました。そこで今回は、PDFファイルにおける画像の扱いについて、わかりやすく解説していきたいと思います。改善するための提案や、疑問点があればお知らせください。

ラスター画像とベクター画像

画像にはラスター画像とベクター画像の2種類があります。ラスター画像はピクセルの集まりで、解像度に依存し、拡大するとピクセルが見えます。JPEG、PNG、BMPなどが一般的です。ベクター画像は線や形状を数式で表現し、解像度に依存せず、拡大しても画質が劣化しません。SVGやAIなどが一般的で、どのサイズにもスケーリング可能です。PDFファイルにはこの両方のタイプの画像を含むことができます。

PDFにおけるラスター画像の保存形式

PDFファイルは通常、画像を別のオブジェクト(XObject)として格納し、そのオブジェクトには画像の生のバイナリデータが含まれています。これらはすべて、ページまたはファイルのリソースオブジェクトにリストされ、それぞれに名前があります(Im1など)。PDFの中に埋め込まれた画像を、Tif、Gif、Bmp、Jpeg、Pngと考えるのは間違いです。そうではありません。

PDFに格納されている画像は通常、一般的な画像フォーマット(例えばTif、Jpg、Pngなど)として保存されるわけではなく、ピクセルのバイナリデータや色空間情報など、画像に関するさまざまな情報を含むオブジェクトとして保存されます。これにより、同じ画像が異なるPDF作成ツールによって異なる方法で保存されることがあります。

PDFオブジェクトビューアの例

PDFオブジェクトビューア

上記の画像は、表紙のメイン画像の部分、Adobe Acrobatのツールから、プリフライト→[オプション]→PDFの内部構造→Logical Structureで閲覧出来ます。

生の画像データがページに必要なサイズに調整されることもあれば、そうでないこともあります。その場合は、描画時に拡大または縮小されます。PDF作成ツールによって、PDFファイルの作成方法はまったく異なります。

圧縮とフォーマット

実際のピクセルデータは圧縮することができ、圧縮フォーマットの一つ(DCTDecode)はJPEGで使用されているものと同じです(JPXはJPEG2000と同じです)。このデータを保存した場合、JPEGファイルとして開くことができますが、色空間データを含むように変更する必要があるかもしれません。

画像の描画と操作

画像は、PDFコンテンツストリーム内でDOコマンドと画像名(Im1など)によって描画されます。この画像は複数回使用することができ、拡大縮小、回転、切り抜きなど、DOコマンド実行時に設定された値を取ることができます。目には画像に見えるものでも、複数の画像で構成されていたり、画像ですらなかったりすることがあります!

画像の抽出について

つまり、PDFからこれらのラスター画像を取り出したい場合、すべての生データから画像を組み立てる必要があるのです。また、画像の「生」(より高画質で、まったく同じサイズであることもあります)バージョンと、切り抜き/拡大縮小されたバージョンがあり、どちらも抽出することができます。

PDFにおけるベクター画像の保存形式

PDFにおけるベクター画像は、数式や描画命令で形状を定義するパス、塗りつぶしやストロークのプロパティ、テキストオブジェクトなどとして保存されます。これにより、解像度に依存せず、どのサイズにもスケーリング可能な高品質なグラフィックが実現されます。

パス、塗りつぶしやストローク

パス(Path): 線や図形はパスとして保存され、描画命令で定義されます。例えば、moveto(開始点の設定)、lineto(直線の描画)、curveto(曲線の描画)などの命令が使用されます。これらの命令は、PostScript言語に基づいており、ベクター画像の基本要素です。

/Path
100 100 moveto
200 200 lineto
150 250 curveto

塗りつぶしとストローク: パスの内部を塗りつぶすための色やパターン、境界線を描くためのストロークプロパティも保存されます。これには色の指定(RGBやCMYK)、グラデーション、パターンなどが含まれます。

/ColorSpace /DeviceRGB
/Color [1.0 0.0 0.0] % 赤色
/Pattern /ShadingType2 % グラデーション

テキスト

テキストオブジェクト: テキストは別のオブジェクトとして保存され、フォント、サイズ、位置、スタイルなどの情報が含まれます。PDF内のテキストはベクター形式で描画されるため、拡大しても画質が劣化しません。

BT % テキストオブジェクトの開始
/F1 12 Tf % フォントとサイズの設定
100 100 Td % 位置の設定
(Hello, World!) Tj % テキストの描画
ET % テキストオブジェクトの終了

これらの要素により、PDFは解像度に依存しない高品質なグラフィックを提供します。線や図とテキストは異なるオブジェクトとして保存され、PDFビューアやエディタではそれぞれを独立して操作できます。例えば、テキストを選択してコピーしたり、パスの色を変更したりすることが可能です。

画像の抽出について

PDFからベクター画像を抽出するには、描画命令や数式に基づいたデータを再構成する必要があります。ベクター画像は、パス、描画命令、塗りつぶしやストロークのプロパティ、テキストオブジェクトなどの形で保存されています。Adobe Illustrator、Pixelmator Proなどのツールを使用してPDFファイルを開き、抽出したい画像部分(図や表など)を視覚的に選択することで、高品質なベクター画像を抽出・編集・保存することが可能です。

より詳しく知りたい方は、ぜひ「PDFってこうなってる? 実践でPDFの内部構造を学ぼう」の記事をご覧下さい。

JavaアプリでのPDFラスタライズが必要になったとき、JPedalの高機能なPDFビューアが効率のよい開発にきっとお役に立つことと思います。

JavaScript環境でのPDFラスタライズなら、PDF→HTML5/SVG変換でドキュメント表示するBuildVuをご検討ください。

JPedal、BuildVuともに無料で試用していただけます。ビューア機能や表示スピード、UIなどを、まずはご自身で実際にお試しのうえ、ぜひ導入をご検討ください。

JPedal

Java PDFライブラリ。表示・変換・テキスト抽出・署名まで、PDFのすべてを処理。

開発者向けPDF入門ガイド 表紙
無料 eBook / 25p

開発者向けPDF入門ガイド

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

ご興味のある製品:

ご入力いただいた情報は、eBookの送付およびインターワークからのご案内にのみ使用いたします。プライバシーポリシー