入門 1 - PDF文書をプログラムで作ろう -
1. はじめに
PDFlib は、Adobe PDF(Portable Document Format)形式ファイルをプログラムで生成するためのプログラムライブラリーです。文書を作るイメージで手順に従って関数を呼んでいけばPDF文書を生成するプログラムを容易に作成することができます。PDFlib はさまざまなOS上のさまざまな言語をサポートしているので、きっと日頃お使いになっている開発環境を使ってPDFを作成することができるでしょう。
プログラムからPDF文書を作成できると、たとえばオンラインショップで購入した商品の名称や価格を織り込んだ注文書を作成したり、人事データから個人台帳を一定の書式で出力するなどPDF文書として扱いたいさまざまな書類をダイナミックに生成することができます。
本稿ではできるだけサンプルを使って、PDFlib の概要をご紹介していきます。プログラム例はPHPを使って記述していますが、他の言語でも言語仕様による違いを除けば基本的な使い方は同じです。またあまり詳細には触れず、マニュアルでは把握しにくい基本的な事柄について説明するように心がけています。技術的な詳細については製品に添付されているマニュアルをご覧ください。(注)
(注) 文中のマニュアルの参照は、PDFlib 10 の日本語版 API リファレンスマニュアルおよびチュートリアルに基づいています。
2. 準備
早速簡単なプログラムの説明に入りたいところですが、まず、PDFlib を利用できる環境を整えたいと思います。ここでは、PHP を例としていますので、PHP での利用方法を簡単に説明します。
-
ダウンロードページからお使いの環境 (OS, 動作ビット数) に合った PDFlib の PHP バインディングをダウンロードし、展開します。
-
bind フォルダー内に php フォルダが見つかります。ここには、PHP のバージョン毎の拡張モジュールが含まれています。例えば、Windows 上で PHP 8.0 (VC16, Thread Safe 版) を使用している場合は、bind/php/php-800_VS16/php_pdflib.dll を使用します。
-
このファイルを php.ini (PHP のコンフィグレーションファイル) の extension_dir= で指定されたフォルダにコピーします。
-
php.ini に extention=php_pdflib.dll (Windows の場合) を追加します。
-
ウェブサーバーを再起動します。
3. 簡単なプログラム例
慣例に従い、PDFlib を使うハローワールドスクリプトから始めましょう。本スクリプトは製品パッケージに付属しているサンプルhello.phpを、日本語フォントを出力するように修正したhello-j.phpです。
このプログラム例を実行するためには、TrueType または OpenType の日本語対応フォントが必要です。本サンプルでは MS 明朝を使用していますが、
IPA フォント等でも可能です。
hello-j.phpのソースコードは以下のようになります。(ソースコード (zip))
ハローワールドソースコード
<?php
/* ハローワールドサンプルスクリプト hello-j.php
* PDFlib パッケージのサンプル hello.php を日本向けに修正
* ※ BOM なし UTF-8 で保存してください
* (notepad で保存すると BOM が付いてしまいます)
* ※ 日本語に対応したフォントファイルが必要です。
* この例ではカレントディレクトリのフォントを使用しています。
*/
/* カレントフォルダを取得 */
$base_dir = dirname(__file__);
/* フォントファイルがあるフォルダのパスを指定 */
$font_dir = "$base_dir/resource/fonts";
/* PDF オブジェクトを生成する */
$p = new PDFlib();
/* load_font() 等でエラーが起きた場合、所定の戻り値 (PHP の場合は 0、
* 他の言語では -1) を戻すように設定する
*/
$p->set_option("errorpolicy=return");
/* PDF をメモリ上に作成する
* 作成中にエラーが発生した場合、エラーメッセージを出力する
*/
if ($p->begin_document("", "") == 0) {
die("Error: " . $p->get_errmsg());
}
/* 文書情報を設定する
* Creator: アプリケーション
* Author: 作成者
* Title: タイトル
*/
$p->set_info("Creator", "hello-j.php");
$p->set_info("Author", "インフォテック (株)");
$p->set_info("Title", "ハローワールド (PHP) !");
/* A4 サイズのページを作成する */
$p->begin_page_ext(0, 0, "width=a4.width height=a4.height");
/* カレントフォルダに置いたフォントファイルをロードする
* ロードに失敗した場合は 0 が戻るので、エラーメッセージを表示する
*/
$p->set_option("searchpath={$font_dir}");
$p->set_option("FontOutline={MS-Mincho=msmincho.ttc}");
$font = $p->load_font("MS-Mincho", "unicode", "");
if ($font == 0) {
die("Error: " . $p->get_errmsg());
}
/* テキストのフォントとフォントサイズを指定する */
$fontopt = "font={$font} fontsize=24";
/* テキストを出力する */
$p->fit_textline("ハローワールド!", 50, 700, $fontopt);
$p->fit_textline("(ようこそ PDFlib の世界へ)", 50, 676, $optlist);
/* ページを閉じる */
$p->end_page_ext("");
/* PDF を閉じる */
$p->end_document("");
/* 作成した PDF をメモリ上から取得し、ブラウザに返す */
$buf = $p->get_buffer();
$len = strlen($buf);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=hello-j.pdf");
print $buf;
/* PDFlib オブジェクトを破棄する */
$p = 0;
PHP 8 / PDFlib 10
4. スクリプトの解説
本スクリプトは「ハローワールド、(ようこそ PDFlib への世界へ) 」というテキストをPDF文書として出力するものです。
まず全体をざっと見ると本スクリプトが下記のように一連の手順に従っているのがわかります。
$p = new PDFlib(); // PDFオブジェクトを生成
$p->begin_document("", "") // 新しいドキュメントを始める
$p->begin_page_ext(0, 0, "width=a4.width height=a4.height");
// 新しいページを始める
(処理を実行する)
$p->end_page_ext(""); // ページを終了する
$p->end_document(""); // ドキュメントを終了する
$p->delete(); // PDFオブジェクトを消去
PHP 8 / PDFlib 10
new PDFlib() でPDFオブジェクトを開き、次いでbegin_document()、begin_page_ext()でそれぞれドキュメント、ページを開きテキストなどのPDF要素を出力し、ページ、ドキュメント、PDFオブジェクトの順で閉じていくというのが共通の手順となります。物理的なドキュメントの作成手順と似ていますね。
本スクリプトの主たる処理はテキストの出力ですが、これはload_font()などのフォントの設定、次いでfit_textline()などによる出力という手順を踏みます。テキストの出力については 入門 5 - テキストを出力する (III) -で詳しく触れます。
begin_document()では、ドキュメントの開始を設定するとともに第1パラメータでPDF文書の出力先ファイル名を指定します。本例のようにファイル名を指定しないとPDF出力はメモリー上に作成され、後半の $buf = $p->get_buffer(); のようにget_buffer()によって変数に取り出すことができます。PHPなどを使ったウェブアプリケーションではこのようにファイルを作成しないでメモリー上でPDF出力を処理できると、パフォーマンス上、またウェブ管理やセキュリティ上からも有利といえます。
本スクリプトによるPDF出力例は、このように (PDFファイル) になります。www.pdflib.comというロゴが大きく出力されているのはライセンスキーを設定していないためです。ライセンスを購入し、ライセンスキーを設定するとロゴが出力されなくなります。
(Nov 10, 2006 - Dec 6, 2021)