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

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 ドキュメントを オープンする必要があることも意味します。

  • 新規ドキュメントをオープンする手法が、変更されました。この関数は、 引数パラメータとして 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_creator ? info 構造体のcreatorフィールドを設定する
PDF_set_info_title ? info 構造体の title フィールドを設定する
PDF_set_info_subject ? info 構造体の subject フィールドを設定する
PDF_set_info_keywords ? info 構造体の keywords フィールドを代入する
PDF_set_info_author ? info 構造体の author フィールドを設定する
PDF_open ? 新規の PDF ドキュメントをオープンする
PDF_close ? PDF ドキュメントを閉じる
PDF_begin_page ? 新規ページを開始する
PDF_end_page ? ページを終了する
PDF_show ? カレントの位置にテキストを出力する
PDF_show_xy ? テキストを指定位置に出力する
PDF_set_font ? フォントの種類及びサイズを選択する
PDF_set_leading ? テキスト行間の距離を設定する
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_memory_image ? PHP の画像関数により作成された画像をオープンする
PDF_open_jpeg ? JPEG 画像をオープンする
PDF_close_image ? 画像を閉じる
PDF_place_image ? 画像をページに置く
PDF_put_image ? 後で使用するために PDF に画像を保存する
PDF_execute_image ? 保存した画像をページに置く
pdf_add_annotation ? 注記を追加する