著者 Mark Stephens (IDRsolutions) 翻訳/編集 インターワーク
私が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オブジェクトビューアの例
※上記の画像は、表紙のメイン画像の部分、Adobe Acrobatのツールから、プリフライト→オプション→PDFの内部構造→Logical Structureで閲覧出来ます。
生の画像データがページに必要なサイズに調整されることもあれば、そうでないこともあります。その場合は、描画時に拡大または縮小されます。PDF作成ツールによって、PDFファイルの作成方法はまったく異なります。
圧縮とフォーマット
実際のピクセルデータは圧縮することができ、圧縮フォーマットの一つ(DCTDecode)はJPEGで使用されているものと同じです(JPXはJPEG2000と同じです)。このデータを保存した場合、JPEGファイルとして開くことができますが、色空間データを含むように変更する必要があるかもしれません。
画像の描画と操作
画像は、PDFコンテンツストリーム内でDOコマンドと画像名(Im1など)によって描画されます。この画像は複数回使用することができ、拡大縮小、回転、切り抜きなど、DOコマンド実行時に設定された値を取ることができます。目には画像に見えるものでも、複数の画像で構成されていたり、画像ですらなかったりすることがあります!
画像の抽出について
つまり、PDFからこれらのラスター画像を取り出したい場合、すべての生データから画像を組み立てる必要があるのです。また、画像の「生」(より高画質で、まったく同じサイズであることもあります)バージョンと、切り抜き/拡大縮小されたバージョンがあり、どちらも抽出することができます(さらに、クリップを生に拡大縮小して、より高画質な画像を作成することもできます - JPedalでは、これを利用して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の内部構造を学ぼう」の記事をご覧下さい。特に、ベクター画像については「PDFってこうなってる? 実践でPDFの内部構造を学ぼう Part 6:パスで図形を描こう」で解説しています。
JavaアプリでのPDFラスタライズが必要になったとき、JPedalの高機能なPDFビューアが効率のよい開発にきっとお役に立つことと思います。
JavaScript環境でのPDFラスタライズなら、PDF→HTML5/SVG変換でドキュメント表示するBuildVuをご検討ください。
JPedal、BuildVuともに無料で試用していただけます。ビューア機能や表示スピード、UIなどを、まずはご自身で実際にお試しのうえ、ぜひ導入をご検討ください。