PDFlib

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

PDFlib 6 からの移行

1) はじめに

PDFlib の最新バージョン PDFlib 9 がリリースされました。PDFlib 9 は、PDF の最新のバージョンをサポートするなど、新たな機能が多数追加されています。これらの機能を利用したいと思いながらも、過去に蓄えられたプログラム資産を捨てるわけにはいかない。こんなお悩みをお持ちのお客様のために、PDFlib 6 を使用するアプリケーションを、どのように PDFlib 9 へ移行するか、具体的なプログラムを交えて解説します。

PDFlib 6 から PDFlib 7 へのメジャーバージョンアップの際、これまで内部に取り込まれていた CMap データを外部リソースとしたこと、pCOS 機能の追加などにより、大幅にユーザーインターフェースが変更・拡張されています。変更前のインターフェースは、互換性の観点から PDFlib 7 では旧関数として利用できましたが (警告対象ではありました)、PDFlib 8 以降では新インターフェースに統一され、使用できなくなるものもありますのでご注意ください。

それでは、順を追って見ていきましょう。

2) CMaps ファイルの指定

CJK 標準フォントを利用している場合、PDFlib 7 以降では CMap ファイルを実行時にロードします。このため、アプリケーションを配布する際には、CMap ファイルと共に配置し、プログラムによりそのディレクトリを指定する必要があります。


  $p = new PDFlib();
  $p->begin_document("sample.pdf", "");
  $p->set_option("searchpath=../../resource/cmap");  // ... ①
    …
  $font = $p->load_font("HeiseiMin-W3", "Ext-RKSJ-H", "");
    …
PHP 5 / PDFlib 9

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

① set_option() で searchpath オプションを使用して CMap ファイルのあるディレクトリを指定しています。

このディレクトリ指定は、相対パスでも絶対パスでも構いませんが、環境やバインディングに依存する面もあるので、絶対パスがより安全です。

searchpath の指定で重要なのは、load_font の呼び出しより前に行うことです。

CMap ファイルは、ダウンロードページからダウンロードし、圧縮されたファイルを解凍してアプリケーションと共に配置します。解凍すると、resource/cmap ディレクトリに複数のファイルが展開されるので、この cmap ディレクトリを指定します。

3) 文書・ページ関数の拡張

PDFlib 6 以降、文書およびページ関数が次のように変更されています。(PDFlib 6 の時点で正しく移行されている場合は、この章は読み飛ばしてかまいません)

PDFlib 5 PDFlib 6 以降 機能
begin_page begin_page_ext ページを開始する
begin_template begin_template_ext テンプレートを開始する
close end_document 文書を閉じる
end_page end_page_ext ページを終了する
end_template end_template_ext ページを終了する
open_file begin_document 文書を開始する
open_mem begin_document_callback コールバックを指定しつつ文書を開始する

例えば、PDFlib 5 と PDFlib 6 以降 では次のようにコードが異なります。


  $p = new PDFlib();
  $p->open_file("sample.pdf");
  $p->begin_page(width, height);
    …
  $p->end_page();
  $p->close();
PHP 4 / PDFlib 5

  $p = new PDFlib();
  $p->begin_document("sample.pdf", "");                     // ... ②
  $p->begin_page_ext(width, height, "");                    // ... ②
    …
  $p->end_page_ext("");                                     // ... ②
  $p->end_document("");                                     // ... ②
PHP 5 / PDFlib 9

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

② オプションリストがいずれも引数として追加されています。

オプションリストが追加されたことにより、パスワードの設定やタグ付き PDF の作成などが柔軟に指定できるようになりました。

begin_xxx 関数と end_xxx 関数を対で利用することにご注意ください。

4) PDI インターフェース

PDFlib 7 では pCOS インターフェースが統合されたため、PDI 関数が次のように変更されています。

PDFlib 6 PDFlib 7 以降 機能
close_pdi close_pdi_document PDI 文書を閉じる
open_pdi open_pdi_document PDI 文書を開く
place_pdi_page fit_pdi_page PDI 文書を作成したページに配置する

例えば、PDFlib 6 と PDFlib 9 では次のようにコードが異なります。


  $p = new PDFlib();
  $p->begin_document("output.pdf", "");
  $pdi = $p->open_pdi("inout.pdf", "");
  $page = $p->open_pdi_page($pdi, 1, "");
  $p->begin_page_ext(width, height, "");
  $p->place_pdi_page($page, 0, 0, 0, 0);
    …
  $p->end_page_ext("");
  $p->close_pdi_page($page);
  $p->close_pdi($pdi);
  $p->end_document("");
PHP 5 / PDFlib 6

  $p = new PDFlib();
  $p->begin_document("output.pdf", "");
  $pdi = $p->open_pdi_document("inout.pdf", "");
  $page = $p->open_pdi_page($pdi, 1, "");
  $p->begin_page_ext(0, 0, "");                             // ... ③
  $p->fit_pdi_page($page, 0, 0, "adjustpage");              // ... ④
    …
  $p->end_page_ext("");
  $p->close_pdi_page($page);
  $p->close_pdi_document($pdi);
  $p->end_document("");
PHP 5 / PDFlib 9

この変更では関数の引数に大きな変更はありません。

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

④ fit_pdi_page では、PDFlib+PDI ファイルの該当ページと同じサイズに調整する「adjustpage」が指定されています。

一般には PDFlib+PDI 側と同じサイズのページを作る事が多く、また、ページの開始時点で③のようにサイズを指定する必要が無いので便利です。

5) pCOS インターフェースの利用

PDFlib 7 では pCOS インターフェースが統合されたため、メタデータを抽出する関数が次のように変更されています。

PDFlib 6 PDFlib 7 以降 機能
get_pdi_parameter pcos_get_string pCOSデータ (文字列) を取得する
get_pdi_value pcos_get_number pCOSデータ (数値) を取得する

例えば、PDFlib 6 と PDFlib 9 では次のようにコードが異なります。


  $pagewidth = $p->get_pdi_value("width", doc, page, 0);
  $pageheight = $p->get_pdi_value("height", doc, page, 0);
  $blockcount = $p->get_pdi_value("vdp/blockcount", doc, page, 0);
  $blockname = $p->get_pdi_parameter("vdp/Blocks[5]/Name", doc, page, 0);
PHP 5 / PDFlib 6

  $pagewidth = $p->pcos_get_number(doc, "pages[3]/width");
  $pageheight = $p->pcos_get_number(doc, "pages[3]/height");
  $blockcount = $p->pcos_get_number(doc, "length:pages[3]/blocks");
  $blockname = $p->pcos_get_string(doc, "pages[3]/blocks[5]/Name");
PHP 5 / PDFlib 9

PDFlib 6 の page はページハンドルであることに対し、PDFlib 7 以降では、pages[3] と4ページ目をページ番号で指定していることに注意してください。

その他の pCOS パスは、チュートリアルマニュアルの pCOS インターフェースの章を参照してください。

6) おわりに

いかがでしたでしょうか。PDFlib 6 からの移行に少しでもお役に立てればと思います。

この他の PDFlib 9 の互換性については、PDFlib 9.2.0 Migration Guide (英文)をご覧ください。PDFlib 7 以降非推奨 (Deprecated) になった関数や削除 (removed) された関数についても記載されています。

PDFlib 9 は、PDF の最新バージョンである PDF 1.7 Extension Level 8 をサポートしていますので、より見栄えの良い、先進の PDF ドキュメントを是非ご利用ください。

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

(Dec 11, 2009 - Sep 27, 2013)