XLIV. PDF 関数

Thomas MerzによるPDFライブラリをインストールしている場合、 PHP で PDF ファイルを作成するために PDF 関数を使用することができます。 (http://www.pdflib.com/pdflib/index.html で取得可能です。コンパ イルにはthe JPEG libraryおよび the TIFF libraryが必要です。 これら2つのライブラリは、PHP の configure を実行する際にもしばしば 問題を発生します。問題を修正するには、configureのメッセージに従っ て下さい。pdflib 2.01を使用している場合、どのようにライブラリがイ ンストールされているかを確認して下さい。pdflib.soとリンクする必要 がありますが、バージョン 2.01 では libpdf2.01.so という名前でだけ ライブラリを作成するため、configureでテストプログラムをリンクする 際にこれを見つけることができません。libpdf.soからlibpdf2.01.soにシ ンボリックリンクを作成しておく必要があります。) pdflibのバージョン2.2では、APIが更に変更され、中国語及び日本語のフォ ントがサポートされました。残念なことにこれにより(php3ではなく)php4 のpdfモジュールにいくつかの変更が生じています。pdflib 2.20を使用し て、メモリ内でPDFドキュメントを生成している場合には注意して下さい。 pdflib 3.0がリリースされるまでは、動作が不安定になる可能性がありま す。pdf_set_font()のパラメータencodingは、文字 列に変更されました。これにより例えば4の代わりに'winansi'を使用する ことが必要となります。

pdflib 2.30を使用している場合、pdf_set_text_matrix() はなくなり、もうサポートされなくなっています。一般に変更点を知るには 使用しているバージョンのpdflibのリリースノートを見てみるのが良いでしょう。

pdflibのソース配布ファイルと共に配布されているpdflibに関する素晴ら しいドキュメントを参照して下さい。この文書は、pdflib の機能に関す る概要を良くまとめています。pdflibのほとんどの関数とPHPモジュール 内の関数の名前は共通になっています。パラメータも同じです。 このモジュールを効率的に使用するには、PDFまたはPostscriptの おおよその考え方も理解しておく必要があります。全ての長さと座標は Postscriptのポイント数で計られます。通常、1インチ当たり 72Postscriptポインタですが、これは、出力解像度に依存します。

FastIOが作成した ClibPDFを使用したpdfドキュメント作成用の別のPHPモジュールがあります。 このライブラリのAPIは、やや異なっています。詳細は、 ClibPDF 関数の節をご覧下さい。

現在、全てのバージョンのpdflibがサポートされています。 機能がより豊富で、古い版でパッチが必要だったいくつかの問題が修正 されているため、最新版を使用することを推奨します。 残念なことに、2.x版の0.6版に対するpdflib APIの変更点は重要なものであり、 いくつかのPHP関数を変更する必要さえありました。 変更点の一覧を以下に示します。

  • Info構造体はもうありません。このため、関数 pdf_get_info()は用済みであり、 関数pdf_set_info_creator(), pdf_set_info_title(), pdf_set_info_author(), pdf_set_info_subject() , pdf_set_info_keywords() は、 info 構造体を最初の引数とせず、pdf ドキュメントとするようになります。 このことは、これらの関数をコールする前に、pdf ドキュメントを オープンする必要があることも意味します。上記の関数は、 pdf_set_info()で置換することが可能で、また、 そうするべきです。

  • 新規ドキュメントをオープンする手法が、変更されました。この関数は、 引数パラメータとして fopen() でオープンされたファイルのファイルハンドル のみをとります。

pdflib の 2.01 版で更にいくつかの変更が行われており、これらは、PHP にも 影響するものです。(pdf_put_image()のような)いくつかの 関数は、もはや必要ありません。警告が発生しますが、驚かないで下さい。

pdf モジュールは、2種類の変数型を導入します(pdflib 2.x の場合は 新しい方を1つだけ使用します)。 これらは、 pdfdoc および pdfinfo です。(pdflib 2.x を使用した場合、pdfinfo は 存在しません) pdfdoc は、pdf ドキュメントへのポインタ であり、最初のパラメータとしてほぼ全ての関数に必要です。 pdfinfo は、PDF ドキュメントに関する メタデータを有しています。 pdf_open() をコールする前に設定する 必要があります。

注意: 以下は、pdflib 0.6 に関してのみ有効です。 より新しいバージョン用の pdflib のマニュアル参照下さい。

テキストをPDFドキュメントに出力するには、各フォント毎のafmファイル を用意する必要があります。 afm ファイルは、Postscript フォントのフォントメトリックスを含んでいます。 デフォルトでは、afm ファイルは PHP スクリプトがある場所の 'fonts' という 名前のディレクトリから検索されます。 (このとは、pdflib 0.6 に関しては正しいですが、 より新しい版では afm ファイルを必要としません。)

ほとんどの関数は、かなり容易に使用することができます。 最も困難なのは完全に新規に pdf ドキュメントを作成する ところでしょう。次の例は、導入の手助けとなるはずです。 この例では、pdflib 0.6 用の PHP 関数を使用し、 ページを1つ有するファイル test.pdf を作成します。 このページは、30pt のアウトラインフォントでテキスト "Times-Roman" により書かれます。テキストは、下線も引かれます。

例 1. PDF ドキュメントを pdflib 0.6 により作成する


<?php
$fp = fopen("test.pdf", "w");
$info = PDF_get_info();
pdf_set_info_author($info, "Uwe Steinmann");
PDF_set_info_title($info, "Test for PHP wrapper of PDFlib 0.6");
PDF_set_info_author($info, "Name of Author");
pdf_set_info_creator($info, "See Author");
pdf_set_info_subject($info, "Testing");
$pdf = PDF_open($fp, $info);
PDF_begin_page($pdf, 595, 842);
PDF_add_outline($pdf, "Page 1");
pdf_set_font($pdf, "Times-Roman", 30, 4);
pdf_set_text_rendering($pdf, 1);
PDF_show_xy($pdf, "Times Roman outlined", 50, 750);
pdf_moveto($pdf, 50, 740);
pdf_lineto($pdf, 330, 740);
pdf_stroke($pdf);
PDF_end_page($pdf);
PDF_close($pdf);
fclose($fp);
echo "<A HREF=getpdf.php3>finished</A>";
?>
     

PHP スクリプト getpdf.php3 は、pdf ドキュメントを出力します。


 <?php
 $fp = fopen("test.pdf", "r");
 header("Content-type: application/pdf");
 fpassthru($fp);
 fclose($fp);
 ?>
      

同じ事を pdflib 2.x で行うと、次のようになります。

例 2. PDF ドキュメントを pdflib 2.x で作成する


 <?php
 $fp = fopen("test.pdf", "w");
 $pdf = PDF_open($fp);
 pdf_set_info_author($pdf, "Uwe Steinmann");
 PDF_set_info_title($pdf, "Test for PHP wrapper of PDFlib 2.0");
 PDF_set_info_author($pdf, "Name of Author");
 pdf_set_info_creator($pdf, "See Author");
 pdf_set_info_subject($pdf, "Testing");
 PDF_begin_page($pdf, 595, 842);
 PDF_add_outline($pdf, "Page 1");
 pdf_set_font($pdf, "Times-Roman", 30, 4);
 pdf_set_text_rendering($pdf, 1);
 PDF_show_xy($pdf, "Times Roman outlined", 50, 750);
 pdf_moveto($pdf, 50, 740);
 pdf_lineto($pdf, 330, 740);
 pdf_stroke($pdf);
 PDF_end_page($pdf);
 PDF_close($pdf);
 fclose($fp);
 echo "<A HREF=getpdf.php3>finished</A>";
 ?>
      

PHP スクリプト getpdf.php3 は、上の例と同じです。

pdflib 配布ファイルには、アナログクロックを有する 本格的なページを作成するより複雑な例があります。 この例は次のように pdflib 2.x 用に変換することができます。 (同じ例は、clibpdf モジュール) 用のドキュメントにもあります。)

例 3. pdflib 2.x 配布ファイルによる pdfclock の例


 <?php
 $pdffilename = "clock.pdf";
 $radius = 200;
 $margin = 20;
 $pagecount = 40;
 
 $fp = fopen($pdffilename, "w");
 $pdf = pdf_open($fp);
 pdf_set_info_creator($pdf, "pdf_clock.php3");
 pdf_set_info_author($pdf, "Uwe Steinmann");
 pdf_set_info_title($pdf, "Analog Clock");
 
 while($pagecount-- > 0) {
     pdf_begin_page($pdf, 2 * ($radius + $margin), 2 * ($radius + $margin));
 
     pdf_set_transition($pdf, 4);  /* wipe */ 
     pdf_set_duration($pdf, 0.5);
   
     pdf_translate($pdf, $radius + $margin, $radius + $margin);
     pdf_save($pdf);
     pdf_setrgbcolor($pdf, 0.0, 0.0, 1.0);
 
     /* 分針 */
     pdf_setlinewidth($pdf, 2.0);
     for ($alpha = 0; $alpha < 360; $alpha += 6) {
         pdf_rotate($pdf, 6.0);
         pdf_moveto($pdf, $radius, 0.0);
         pdf_lineto($pdf, $radius-$margin/3, 0.0);
         pdf_stroke($pdf);
     }
 
     pdf_restore($pdf);
     pdf_save($pdf);
 
     /* 5 分ずつ進む */
     pdf_setlinewidth($pdf, 3.0);
     for ($alpha = 0; $alpha < 360; $alpha += 30) { 
         pdf_rotate($pdf, 30.0);
         pdf_moveto($pdf, $radius, 0.0);
         pdf_lineto($pdf, $radius-$margin, 0.0);
         pdf_stroke($pdf);
     }
 
     $ltime = getdate();
 
     /* 時針を描く */
     pdf_save($pdf);
     pdf_rotate($pdf,-(($ltime['minutes']/60.0)+$ltime['hours']-3.0)*30.0);
     pdf_moveto($pdf, -$radius/10, -$radius/20);
     pdf_lineto($pdf, $radius/2, 0.0);
     pdf_lineto($pdf, -$radius/10, $radius/20);
     pdf_closepath($pdf);
     pdf_fill($pdf);
     pdf_restore($pdf);
 
     /* 分針を描く */
     pdf_save($pdf);
     pdf_rotate($pdf,-(($ltime['seconds']/60.0)+$ltime['minutes']-15.0)*6.0);
     pdf_moveto($pdf, -$radius/10, -$radius/20);
     pdf_lineto($pdf, $radius * 0.8, 0.0);
     pdf_lineto($pdf, -$radius/10, $radius/20);
     pdf_closepath($pdf);
     pdf_fill($pdf);
     pdf_restore($pdf);
 
     /* 秒針を描く */
     pdf_setrgbcolor($pdf, 1.0, 0.0, 0.0);
     pdf_setlinewidth($pdf, 2);
     pdf_save($pdf);
     pdf_rotate($pdf, -(($ltime['seconds'] - 15.0) * 6.0));
     pdf_moveto($pdf, -$radius/5, 0.0);
     pdf_lineto($pdf, $radius, 0.0);
     pdf_stroke($pdf);
     pdf_restore($pdf);
 
     /* 小さな円を中心に描く */
     pdf_circle($pdf, 0, 0, $radius/30);
     pdf_fill($pdf);
 
     pdf_restore($pdf);
 
     pdf_end_page($pdf);
 }
 
 $pdf = pdf_close($pdf);
 fclose($fp);
 echo "<A HREF=getpdf.php3?filename=".$pdffilename.">finished</A>";
 ?>
      

PHP スクリプト getpdf.php3 は、pdf ドキュメントを出力します。

 <?php
 $fp = fopen($filename, "r");
 header("Content-type: application/pdf");
 fpassthru($fp);
 fclose($fp);
 ?>
       

目次
PDF_get_info — PDF ドキュメントの空の info 構造体を返す
PDF_set_info — ドキュメント情報のフィールドを設定する
PDF_open — 新規の PDF ドキュメントをオープンする
PDF_close — PDF ドキュメントを閉じる
PDF_begin_page — 新規ページを開始する
PDF_end_page — ページを終了する
PDF_show — カレントの位置にテキストを出力する
PDF_show_boxed — 箱の中にテキストを出力する
PDF_show_xy — テキストを指定位置に出力する
PDF_set_font — フォントの種類及びサイズを選択する
PDF_set_leading — テキスト行間の距離を設定する
PDF_set_parameter — パラメータを設定する
PDF_get_parameter — パラメータを得る
PDF_set_value — 数値を設定する
PDF_get_value — 数値を得る
PDF_set_text_rendering — テキストの描画法を定義する
PDF_set_horiz_scaling — テキストの水平スケールを設定する
PDF_set_text_rise — テキストを拡大する
PDF_set_text_matrix — テキスト行列を設定する
PDF_set_text_pos — テキスト位置を設定する
PDF_set_char_spacing — 文字間の空白を設定する
PDF_set_word_spacing — 単語間の空白を設定する
PDF_continue_text — 次の行にテキストを出力する
PDF_stringwidth — カレントフォントのテキストの幅を返す
PDF_save — 現在の環境を保存する
PDF_restore — 以前保存された環境を回復する
PDF_translate — 座標系の原点を設定する
PDF_scale — スケールを設定する
PDF_rotate — 回転を設定する
PDF_setflat — 平面度を設定する
PDF_setlinejoin — linejoin パラメータを設定する
PDF_setlinecap — linecap パラメータを設定する
PDF_setmiterlimit — miter リミットを設定する
PDF_setlinewidth — ライン幅を設定する
PDF_setdash — 破線パターンを設定する
PDF_moveto — 現在の位置を設定する
PDF_curveto — 曲線を描く
PDF_lineto — 線を描く
PDF_circle — 円を描く
PDF_arc — 円弧を描く
PDF_rect — 長方形を描く
PDF_closepath — パスを閉じる
PDF_stroke — パスに基づいて線を描く
PDF_closepath_stroke — パスを閉じ、パスに基づいて線を出力する
PDF_fill — カレントのパスに設定する
PDF_fill_stroke — カレントのパスを塗りつぶし、パスを描く
PDF_closepath_fill_stroke — カレントのパスを閉じ、塗りつぶし、描く
PDF_endpath — カレントのパスを終了する
PDF_clip — カレントのパスに切り取る
PDF_setgray_fill — 塗りつぶし色をグレー値に設定する
PDF_setgray_stroke — 描画色をグレー値に設定する
PDF_setgray — 描画および塗りつぶし色をグレー値に設定する
PDF_setrgbcolor_fill — 塗りつぶし色を RGB カラー値に設定する
PDF_setrgbcolor_stroke — 描画色を RGB カラー値に設定する
PDF_setrgbcolor — 描画および塗りつぶし色を RGB カラー値に設定する
PDF_add_outline — カレントのページにブックマークを追加する
PDF_set_transition — ページ間の移動を設定する
PDF_set_duration — ページ間の持続時間を設定する
PDF_open_gif — GIF 画像をオープンする
PDF_open_png — PNGイメージをオープンする
PDF_open_memory_image — PHP の画像関数により作成された画像をオープンする
PDF_open_jpeg — JPEG 画像をオープンする
PDF_close_image — 画像を閉じる
PDF_place_image — 画像をページに置く
PDF_put_image — 後で使用するためにPDFにイメージを保存する
PDF_execute_image — 保存した画像をページに置く
pdf_add_annotation — 注記を追加する
PDF_set_border_style — リンクおよび注記の周囲の境界のスタイルを設定する
PDF_set_border_color — リンクおよび注記の周囲の境界の色を設定する
PDF_set_border_dash — リンクおよび注記の周囲の境界のダッシュのスタイルを設定する