L. pdf 関数

導入

Thomas Merzによるpdfライブラリをインストールしている場合、PHPで pdfファイルを作成するために pdf 関数を使用することができます。 (http://www.pdflib.com/pdflib/index.html で取得可能です。)コンパ イルにはJPEGライブラリおよび TIFFライブラリも必要です。 これら2つのライブラリは、PHP の configure を実行する際にもしばしば 問題を発生します。問題を修正するには、configureのメッセージに従っ て下さい。

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

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

pdfモジュールは、1種類の変数型を導入します。これは、 pdfdocです。pdfdoc は、pdf ドキュメントへのポインタであり、最初のパラメータとしてほ ぼ全ての関数に必要です。

古いバージョンのpdflibとの混乱

PHPにおいてpdfサポートが開始されたのは、— pdflib 0.6 — からであるため、特にPDFLIB APIにおいて多くの変更が行われ ています。これらの変更の多くは、PHPによりなんとか対応されてきまし たが、いくつかの変更については、PHP APIの変更が必要でした。PDFLIB 3.x のAPIは安定しているようなので、PHP 4では、このバージョン以降が pdfサポートについて必要としています。結果的に多くの関数が消えたり、 他の関数により置換されたりしています。PDFLIB 0.6のサポートは、完 全に諦められています。次の表には、PHP 4.0.2で廃止され、新しいバー ジョンの関数に置換する必要がある関数全てのリストを示しています。

表 1. 廃止された関数と代替関数

古い関数代替関数
pdf_put_image()もう、不要です。
pdf_get_font() pdf_get_value() は、 "font" を2番目の引数として渡します。
pdf_get_fontsize() pdf_get_value() は、 "fontsize"を2番目の引数として渡します。
pdf_get_fontname() pdf_get_parameter()は、 "fontname"を2番目の引数として渡します。
pdf_set_info_creator() pdf_set_info()は、 "Creator"を2番目の引数として渡します。
pdf_set_info_title() pdf_set_info()は、 "Title"を2番目の引数として渡します。
pdf_set_info_subject() pdf_set_info()は、 "Subject"を2番目の引数として渡します。
pdf_set_info_author() pdf_set_info()は、 "Author"を2番目の引数として渡します。
pdf_set_info_keywords() pdf_set_info()は、 "Keywords"を2番目の引数として渡します。
pdf_set_leading() pdf_set_value()は、 "leading"を2番目の引数として渡します。
pdf_set_text_rendering() pdf_set_value()は、 "textrendering"を2番目の引数として渡します。
pdf_set_text_rise() pdf_set_value()は、 "textrise"を2番目の引数として渡します。
pdf_set_horiz_scaling()pdf_set_value()は、 "horizscaling"を2番目の引数として渡します。
pdf_set_text_matrix()もう利用出来ません
pdf_set_char_spacing() pdf_set_value()は、 "charspacing"を2番目の引数として渡します。
pdf_set_word_spacing() pdf_set_value()は、 "wordspacing"を2番目の引数として渡します。
pdf_set_transition() pdf_set_parameter()は、 "transition"を2番目の引数として渡します。
pdf_set_duration() pdf_set_value()は、 "duration"を2番目の引数として渡します。
pdf_open_gif() pdf_open_image_file()は、 "gif"を2番目の引数として渡します。
pdf_open_jpeg() pdf_open_image_file()は、 "jpeg"を2番目の引数として渡します。
pdf_open_tiff() pdf_open_image_file()は、 "tiff"を2番目の引数として渡します。
pdf_open_png() pdf_open_image_file()は、 "png"を2番目の引数として渡します。
pdf_get_imagewidth() pdf_get_value()は、 "imagewidth"を2番目の引数、imageを3番目の 引数として渡します。
pdf_get_imageheight() pdf_get_value()は、 "imageheight"を2番目の引数、imageを3番目の 引数として渡します。
()()

pdflib 3.xのインストールに関するヒント

PDFLIBのバージョン3.0以降では、オプション --enable-shared-pdflibを付けてPDFLIBの configureを行う必要があります。

pdflibの古いバージョンに関する問題

PDFLIB 2.01を使用している場合、ライブラリがどのようにインストール されているかを確認して下さい。ファイルlibpdf.soまたはそのファイル へのリンクが存在している必要があります。バージョン2.01は、 libpdf2.01.soという名前のライブラリを作成するだけなので、 configure のテストプログラムをリンクする際に見付けることができま せん。libpdf.soからlibpdf2.01.soへのシンボリックリンクを作成する 必要があります。

PDFLIBのバージョン 2.20 では、APIの更なる変更が行われ、中国語と日 本語のフォントがサポートされました。残念なことに、これにより、 (PHP 3ではなく)PHP 4のpdfモジュールにいくつかの変更が生じています。 PDFLIB 2.20 を使用している場合には、pdfドキュメントのメモリ内での 生成を処理する際に注意が必要です。 pdf_set_font()のパラメータencodingは、文字列に 変更されています。これは、例えば、4の代わりに'winansi'を使用しな ければならないことを意味します。

PDFLIB 2.30 を使用している場合、 pdf_set_text_matrix()は廃止されています。 この関数はもうサポートされていません。一般にPDFLIBで生じた変更に 関しては、使用するバージョンのPDFLIBのリリースノートを参照下さい。

2000/3/9以降のバージョンのPHP 4では、3.0より前のバージョンのPDFLIB をサポートしていません。他方、PHP 3では 2.01より新しいバージョンで 使用されているこはできません。(訳注:パッチをあてればPHP 3でも PDFLIB3を使用可能です。)

多くの関数の使用法は簡単です。最も困難なのは、非常に簡単なpdfドキュ メントを作成する場合でしょう。次の例は、入門の際の助けとなるはず です。この例では、1ページを有するファイル test.pdfが作成されます。このページは、30ポイ ントのアウトラインフォントでテキスト"Times-Roman"を有しています。 テキストには下線も引かれます。

例 1. PDFLIBでpdfドキュメントを作成する


<?php
$fp = fopen("test.pdf", "w");
$pdf = pdf_open($fp);
pdf_set_info($pdf, "Author", "Uwe Steinmann");
pdf_set_info($pdf, "Title", "Test for PHP wrapper of pdflib 2.0");
pdf_set_info($pdf, "Creator", "See Author");
pdf_set_info($pdf, "Subject", "Testing");
pdf_begin_page($pdf, 595, 842);
pdf_add_outline($pdf, "Page 1");
pdf_set_font($pdf, "Times-Roman", 30, "host");
pdf_set_value($pdf, "textrendering", 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.php>finished</A>";
?>
      

以下のスクリプトgetpdf.phpはpdfドキュメン トを返すだけのものです。


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

PDFLIB配布ファイルには、アナログクロックで本格的なページを作成す るより複雑な例が含まれています。この例をPDFLIBを使用してPHPに変換 すると、次に示すようになります。(clibpdf モジュール)のドキュメントにも同じ例があります。)

例 2. pdflib配布ファイル中の pdfclockの例


<?php
$pdffilename = "clock.pdf";
$radius = 200;
$margin = 20;
$pagecount = 40;

$fp = fopen($pdffilename, "w");
$pdf = pdf_open($fp);
pdf_set_info($pdf, "Creator", "pdf_clock.php3");
pdf_set_info($pdf, "Author", "Uwe Steinmann");
pdf_set_info($pdf, "Title", "Analog Clock");

while($pagecount-- > 0) {
    pdf_begin_page($pdf, 2 * ($radius + $margin), 2 * ($radius + $margin));

    pdf_set_parameter($pdf, "transition", "wipe");
    pdf_set_value($pdf, "duration", 0.5);
  
    pdf_translate($pdf, $radius + $margin, $radius + $margin);
    pdf_save($pdf);
    pdf_setrgbcolor($pdf, 0.0, 0.0, 1.0);

    /* 1分刻みの目盛 */
    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.php?filename=".$pdffilename.">finished</A>";
?>
      

以下のPHPスクリプトgetpdf.phpは、pdfドキュ メントを出力するだけのものです。


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

目次
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_get_image_height — イメージの高さを返す
pdf_get_image_width — イメージの幅を返す
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_skew — 座標系を歪ませる
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_image_file — ファイルからイメージを読み込む
pdf_open_memory_image — PHP の画像関数により作成された画像をオープンする
pdf_open_jpeg — JPEG 画像をオープンする
pdf_open_tiff — TIFFイメージをオープンする
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 — リンクおよび注記の周囲の境界のダッシュのスタイルを設定する