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.3.0 Migration Guide (英文)をご覧ください。PDFlib 7 以降非推奨 (Deprecated) になった関数や削除 (removed) された関数についても記載されています。
PDFlib 9 は、PDF の最新バージョンである PDF 1.7 Extension Level 8 をサポートしていますので、より見栄えの良い、先進の PDF ドキュメントを是非ご利用ください。
疑問点やリクエストなどがあれば、お問い合わせフォームからお問合せ下さい。
(Dec 11, 2009 - Sep 27, 2013)