PDFlib

高度なPDFアプリケーションの開発を支援する定番プログラムライブラリー Supported by インフォテック株式会社

イメージファイルの取り扱い

1) はじめに

本記事ではイメージファイルの取り扱いについて解説します。

PDFで帳票類や書類を作成する場合、文書に陰影や企業ロゴを入れると文書の見栄えが大変良くなります。今回は PDFlib でイメージファイルの指定方法やイメージファイルを使用する際の注意点等に焦点を当てて解説します。

2) 扱えるイメージファイルの種類

PDFlib ではラスタ画像を取り扱う事が出来ます。取り扱う事が出来るラスタ画像は下表の通りです。

フォーマット 対応内容
PNG ISO 15948 で定められたあらゆる種類の PNG 画像に対応しています。PNG 画像が透明情報を持っている場合、その透明は生成されるPDF文書内でも保持されます。アルファチャンネルには対応していません。
JPEG 一般的に用いられているJPEG画像に対応していますが、マルチスキャンを持つ JPEG 画像に対しては Acrobat 内の制約により対応していません。
JPEG2000 PDF 1.5以上を出力する場合にのみ対応しています。
GIF GIF 87a ・89aに対応しています。
TIFF 現行のほとんどの種類のTIFF 画像を扱う事が出来ますが、旧形式 TIFF-JPEG のいくつかはサポートしていません。
BMP BMPバージョン2・3に対応しています。
CCITT グループ3 ・グループ4 の FAX 圧縮された画像データに対応していますが、CCITT 画像を分析する能力はありません。
RAW データ 対応しています。

※各画像フォーマット毎の詳細な取り扱いや制限についてはマニュアルをご覧ください。

3) 基本的な画像の取り扱い方法

PDFlib で画像を取り扱う場合、取り扱う画像を開き、出力します。具体的なソースは下記の様になります。


  $p = new PDFlib();
     .
     .
     .
  $image = $p->load_image("auto", "ファイル名", ""); // ... ①
  if ($image != 0)                                   // ... ②
    $p->fit_image($image, 0.0, 0.0, "");             // ... ③
  $p->close_image($image);                           // ... ④
     .
     .
     .
  $p = 0;
PHP 5.1 / PDFlib 7.0

基本的な処理は下記の流れで行います。

① load_image() で、取り扱うイメージファイルを指定し、ロードします。
② 取り扱うイメージファイルが正常にロードできたかを判定します。

イメージファイルのロードに失敗した時の戻り値は、PHPの場合は 0、その他の言語の場合は -1となります。

③ イメージファイルをx座標:0.0, y座標:0.0の位置に出力します。
④ イメージファイルを閉じます。
【同一画像を複数回使用する際のTips】

ロゴなどのように、複数ページにわたって同一の画像ファイルを出力する必要がある場合、画像データを再利用可能画像として出力する事が可能です。その場合、上記の例で行っている fit_image() のすぐ後の close_image() を呼び出さず、出力が必要な箇所で fit_image() を複数回呼び出し、該当する画像を使用しなくなった時点で、close_image() を行います。

具体的なソースは下記の様になります。


  $p = new PDFlib();
     .
     .
     .
  $image = $p->load_image("auto", "ファイル名", "");   // ... ①
  if ($image == 0)                                     
    die("Error: " . $p->get_errmsg());
     .
     .
     .
  $p->begin_page_ext($width, $height, "");             // ... ②
  $p->fit_image($image, 0.0, 0.0, "");                 // ... ③
  $p->end_page_ext("");                                // ... ④
     .
     .
     .
  $p->begin_page_ext($width, $height, "");             // ... ⑤
  $p->fit_image($image, 0.0, 0.0, "");                 // ... ⑥
  $p->end_page_ext("");                                // ... ⑦
     .
     .
     .
  $p->close_image($image);                             // ... ⑧
     .
     .
     .
  $p = 0;
PHP 5.1 / PDFlib 7.0

基本的な処理は下記の流れで行います。

① load_image() で、取り扱うイメージファイルを指定し、ロードします。
② 新しいページを開始します。
③ イメージファイルをx座標:0.0, y座標:0.0の位置に出力します。
④ ページを閉じます。
⑤ 新しいページを開始します。
⑥ イメージファイルをx座標:0.0, y座標:0.0の位置に出力します。
⑦ ページを閉じます。
⑧ イメージを閉じます。

上記の処理を行う際、fit_image() のパラメータにより、出力画像の比率や出力位置を変更しても問題ありません。

ページ数が多く、同一の画像ファイルを使用するページが多い場合、この手法で生成される PDF ファイルの容量を削減できる事があります。

4) 透明機能

画像を重ね合わせたりする際、背景の画像や文字が見えて欲しい場合があります。

PDFlib は下記の透明機能に対応しています。

透明機能 内容
位置によるマスク 「前景を印刷するか、背景を印刷するか」という情報を画像内部に組み込んでおく事が出来ます。
カラー値によるマスク テレビ等で使用されるブルースクリーン処理のように、特定の色のピクセルを透明にします。
ソフトマスク PDF1.4以降ではアルファチャンネルが導入されました。画像マスクの概念を、複数ビットのマスクに拡張したものです。画像を既存の背景とブレンドしたり、半透明の物を作ったりすることが出来ます。

5) 透明情報への対応

PDFlib は下記の3種類の画像内透明情報に対応しています。

1. 内在透明

画像ファイル内の透明情報を検出・利用し、透明処理を行います。

2. 外在透明

透明マスクとして画像を指定し、使用します。マスク内でピクセル値が0の部分の画像が塗られ、0で無い部分の画像は背景が透けて見えます。

3. 画像マスク

画像マスクはビット深度が1の画像で、0のビットが透明として扱われます。1のビット部分はカレントの塗り色として着色されます。

以下にそれぞれの方法について解説します。

5-1) 内在透明

画像ファイル内の透明情報を利用する内在透明の場合、特別な処理は必要ありません。

但し、読み込む画像ファイルは、画像ファイル内に透明情報を保持している画像ファイルの必要があります。

対応している画像ファイルは下記の通りです。

  • GIF画像
  • PNG画像

具体的なソースは下記の様になります。


  $p = new PDFlib();
     .
     .
     .
  $image = $p->load_image("gif", "ファイル名", ""); // ... ①
  if ($image != 0)
    $p->fit_image($image, 0.0, 0.0, "");
  $p->close_image($image);
     .
     .
     .
  $p = 0;
PHP 5.1 / PDFlib 7.0

基本的な処理は下記の流れで行います。

① load_image() で、取り扱うイメージファイルを指定し、ロードします。

対応する画像フォーマットのファイルを指定します。

読み込んだ画像のうち、透明カラー値が指定されているエリアが透明に出力されます。「白色」は「白色」であり、「透明」では無い事に注意してください。透明カラー値の指定方法は、ご利用になられている画像処理ソフトのマニュアルをご覧ください。

5-2) 外在透明

対応している画像ファイルは下記の通りです。

  • GIF画像
  • PNG画像

具体的なソースは下記の様になります。


  $p = new PDFlib();
     .
     .
     .
  $mask = $p->load_image("png", "マスク用ファイル名", "mask"); // ... ①
  if($mask == 0)
    die("Error mask: " . $p->get_errmsg());

  $optlist = "masked " . $mask;                                // ... ②
  $image = $p->load_image("auto", "画像ファイル名", $optlist); // ... ③
  if($image == 0)
    die("Error image: " . $p->get_errmsg());

  $p->begin_page_ext(10, 10, "");
  $p->fit_image($image, 0.0, 0.0, "adjustpage");               // ... ④
  $p->end_page_ext("");

  $p->close_image($mask);
  $p->close_image($image);

  $image = $p->load_image("gif", "ファイル名", "");
     .
     .
     .
  $p = 0;
PHP 5.1 / PDFlib 7.0

基本的な処理は下記の流れで行います。

① load_image() で、取り扱うイメージファイルを指定し、ロードします。

対応する画像フォーマットのファイルを指定します。

読み込んだ画像のうち、透明カラー値が指定されているエリアが透明に出力されます。「白色」は「白色」であり、「透明」では無い事に注意してください。透明カラー値の指定方法は、ご利用になられている画像処理ソフトのマニュアルをご覧ください。

5-3) 画像マスク

画像マスクとは、マスクで指定した画像の特定の色を透過処理させ、背景に配置した画像を透明部分を通して見せる処理です。

TV などで用いられるブルースクリーン処理と同等の処理です。

画像マスクとして使えるのは以下の種類の画像です。

フォーマット 備考
PNG 画像  
TIFF 画像  
JPEG 画像 PDF1.4以上で、ソフトマスクとしてのみ
BMP 画像 他の種類の画像と向きが違うことに注意してください。 そのため BMP 画像はマスクとして使うにはまず x 軸を軸として反転させる必要があります。
RAW 画像データ  

画像マスクはただ mask オプションをつければ開くことができ、希望の塗り色を設定した後にページ上に配置することができます。

具体的なソースは下記の様になります。


  $p = new PDFlib();
     .
     .
     .
  $mask = $p->load_image("auto", "マスクファイル名", "mask"); // ... ①
  $p->setcolor("fill", "rgb", 1.0, 0.0, 0.0, 0.0);            // ... ②
  if($mask != 0)
    $p->fit_image($mask, $x, $y, "");                         // ... ③

  $p->begin_page_ext(10, 10, "");
  $p->fit_image($image, 0.0, 0.0, "adjustpage");
  $p->end_page_ext("");

  $p->close_image($mask);
  $p->close_image($image);

     .
     .
     .
  $p = 0;
PHP 5.1 / PDFlib 7.0

基本的な処理は下記の流れで行います。

① load_image() で、取り扱うイメージファイルを指定し、ロードします。

オプションで"mask"を指定して、画像マスクとしてロードします。

② カレントカラースペースの色を設定します。
③ 画像マスクを出力します。
【透明の無効化について】

GIF 画像ファイル等を取り扱う際に、ファイルの透明情報を一切無視したほうがよい場合があります。その場合は、ファイルを開く時にignoremask オプションをつければ PDFlib の自動透明機能は無効にすることができます。

具体的なソースは下記の様になります。


  $p = new PDFlib();
     .
     .
     .
  $p->begin_page_ext($width, $height, "");
  $image = $p->load_image("gif", "ファイル名", "ignoremask"); // ... ①
  if ($image != 0)
    $p->fit_image($image, 0.0, 0.0, "");
  $p->close_image($image);
PHP 5.1 / PDFlib 7.0

基本的な処理は下記の流れで行います。

① load_image() で、取り扱うイメージファイルを指定し、ロードします。

オプションで"ignoremask"を指定して、透明処理を無効化します。


6) 画像の着色

PDFlib ではスポットカラーによる画像の着色が行えます。この機能は以下の形式の単色かグレースケールの画像で動作します。

  • BMP
  • PNG
  • JPEG
  • TIFF (シングルストリップでもマルチストリップでも)
  • GIF

具体的なソースは下記の様になります。


  $p = new PDFlib();
     .
     .
     .
  $p->begin_page_ext($width, $height, "");
  $p->setcolor("both", "cmyk", 1, .79, 0, 0);                 // ... ①
  $spot = $p->makespotcolor("PANTONE Reflex Blue CV");        // ... ②
  $optlist = "colorize " . $spot;                             // ... ③
  $image = $p->load_image("tiff", "ファイル名", $optlist)     // ... ④
  if($image != 0)
    $p->fit_image($image, $x, $y, "");
  $p->end_page_ext("");
     .
     .
     .
  $p = 0;
PHP 5.1 / PDFlib 7.0

基本的な処理は下記の流れで行います。

① カレントカラースペースの色を設定します。
② 組み込みスポットカラー名を検索します。もしくはカレント塗り色からスポットカラーを作成して命名します。
③ 取得したカラーハンドルを利用してオプションリストを作成します。
④ 作成したオプションリストを使用してイメージを読み込みます。

RGB パレットを持つ画像に関しては、着色が意味を持つのは、そのパレットがグレー値だけを持ち、パレットインデックスがグレー値と等価な場合だけです。しかし PDFlib はこの条件に関する検査は行いません。

7) 複数ページ画像ファイル

複数の画像を持つ TIFF ファイルに PDFlib は対応しています。複数ページ TIFF を利用するには、PDF_load_image() への呼び出しで追加の文字列・数値パラメタを用います。

具体的なソースは下記の様になります。


  $p = new PDFlib();
     .
     .
     .
  $p->begin_page_ext($width, $height, "");
  $image = $p->load_image("tiff", "ファイル名", "page 2");    // ... ①
  if ($image != 0)
    $p->fit_image($image, 0.0, 0.0, "");
  $p->end_page_ext("");
     .
     .
     .
  $p = 0;
PHP 5.1 / PDFlib 7.0

基本的な処理は下記の流れで行います。

① load_image() で、取り扱うイメージファイルを指定し、ロードします。

page オプションは複数画像ファイルが用いられることを示します。"page x"形式で用いる画像番号を指定します。最初の画像の番号は1 です。

8) おわりに

画像ファイルはロゴマーク等で文書中に効果的に挿入すると、見栄えが格段に良くなります。また、印影をイメージファイル化すれば、見積書等の文書に印影を挿入することが出来ます。前回のフォントと比較すると、使用する機会は少ないですが、要所要所で活用すると、大変文書の見栄えが良くなります。

是非マスターしてください。

疑問点やリクエストなどがあれば、 お問い合わせフォームからお問合せください。

(Mar 8, 2007 - Sep 27, 2013)