PDFlib

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

入門 11 - PDFlib ブロック機能による文書作成 (II) -

2. ブロック機能によるPDF文書の作成

1) 入力文書の作成

それではブロック機能を使ってPDF文書を作成しましょう。まず PDFlib の入力となるPDF文書を作成します。ブロックを定義するPDF文書を効率的に作成するのには以下の手順が良いようです。

  1. ワープロ等で文書例を作成する
  2. ワープロから文書例をPDF文書に出力する
  3. ブロックプラグインによりPDF文書にブロックを定義する
  4. ワープロで文書例から出力する部分を削除し、PDF文書に変換する
  5. 3.で作成したブロックを4.のPDF文書にコピーまたはインポートする

上記の手順をもう少し詳しく説明します。

最初にMicrosoft社Wordなどのワープロや文書作成ソフトにより、最終出力イメージとなる文書例を作成します。文書例には、ブロックに出力するテキストやイメージのサンプルもレイアウトします。テキストは最大長になる例をレイアウトしたほうがあとでブロックを定義するときに便利です。

次に作成した文書ファイルをPDFに変換します。Microsoft Wordでは、Adobe社のAcrobatをインストールするとPDFMakerがWordに組み込まれ、Wordの中からPDF文書への変換が行えます。なお、PDFlib はAcrobatで作成したPDF文書を読み込むことを前提として開発されていますので、それ以外のツールで変換を行って問題が生じた場合には対応できない場合がありますのでご注意ください。

作成したPDF文書をAcrobatで読みこみ、プログラムより出力する予定の領域にブロックを定義していきます。このとき、テキストの場合は「背景フォントの検出」機能をオンにしておくとサンプルテキストで使用しているフォント名やサイズを、イメージやグラフィック要素の場合は「オブジェクト選択でブロックを定義」をオンにしておくと外接の矩形領域を、ブロックプロパティに設定することが可能です。

このままでは、サンプルテキストなどがPDF文書に残ってしまうので、いったん文書作成ソフトに戻りサンプルテキストなどを削除し、新たにPDF文書に変換します。

上記のPDF文書にはブロック定義がないので、ブロックプラグインによりさきに作ったPDF文書からブロックの定義をコピーまたはインポートします。これで PDFlib の入力となるPDF文書ができあがりです。

2) 出力例

下図にブロック機能による出力例を示します。本例はオンラインフラワーショップを想定した購入内容確認の簡単な例です。図中、青枠の部分がテキストタイプのブロックを定義した領域、オレンジの枠の部分がイメージタイプのブロックを定義した部分です。実際に1)の手順で作成した入力用PDF文書を使用して出力しています。

以下、スクリプトの主要部分を説明します。ドキュメントをオープンした後は、下記のようにPDI機能を使ってブロックを定義したPDF文書を読み込みます。


//取り込むPDF文書を開く
  $infile="../data/shoplist-in.pdf";
  $doc = $p->open_pdi_document($infile, "");
  if ($doc == 0) {
    die("Error: " . $p->get_errmsg());
  }

//取り込みしたものの1ページ目を開く
  $page = $p->open_pdi_page($doc, 1, "");
  if ($page == 0) {
    die("Error: " . $p->get_errmsg());
  }

//ページの開始
  $p->begin_page_ext(20.0, 20.0, "");
//取込みページの配置
  $p->fit_pdi_page($page, 0, 0, "adjustpage");

/* テキストの出力は以下のようになります。ここでテキストは配列にセットされて
 * いるため、実際のブロックへの出力を行う$p->fill_textblock()関数を
 * foreach文でループしています。フォントの種別、文字サイズ、ブロック内の水
 * 平配置などはブロックのプロパティを指定しているため、スクリプトで特に指定
 * する必要がありません。もちろんスクリプトによりオーバーライドすることも可
 * 能です。
 */

//タイトルの設定
  $textj = array("text_title" => "山田太郎様の\お買い上げ内容",
//テキストの設定
  "text_thanks" => "この度は当店をご利用いただき\誠にありがとうございます。"
// encoding はプログラムで指定する必要がある
  $optlist = "encoding=unicode";

  foreach ($textj as $key => $value) {
    if ($p->fill_textblock($page, $key, $txt, $optlist) == 0) {
      printf("Warning: %s\n ", $p->get_errmsg());
    }
  }

/* イメージの出力は同様にPDF_fill_imageblock()関数により行います。
 * このとき下記のようにイメージをロードしてから出力を行います。 
 */
  $image = array();
  foreach ($image as $key => $value) {
//画像配置
    $img = $p->load_image("auto", $value, "");
    if (!$img) {
      die("Error: " . $p->get_errmsg());
    }
    if($p->fill_imageblock($page, $key, $img,"")== 0) {
       printf("Warning: %s\n ",$p->get_errmsg());
    }
  }

  $p->close_pdi_page($page);   //取り込みページを閉じる
PHP 8 / PDFlib 10
図 PDFlib ブロック機能による出力例
(Nov 10, 2006 - Dec 6, 2021)