PHP マニュアル
前のページ |  | 次のページ

# LXXVIIpdf 関数

# 導入

PHPのPDF関数は、Thomas Merzにより作成されたPDFlibライブラリを使用してPDFファイル を作成することが可能です。PDFlibは、http://www.pdflib.com/pdflib/index.html でダウンロード可能ですが、商用 で使用する場合はライセンスを購入する必要があります。この拡張モジュー ルをコンパイルするには、JPEGおよ びTIFF が必要です。PHPにPDFサポー トを組み込む際のより詳細な情報については、PDFlib インストール の節を参照下さい。

本節のドキュメントは、PDFlibライブラリで利用可能な関数の概要のみ を説明することを意図しています。ここで扱う各関すの完全で詳細な説 明については、PDFlibのソース配布ファイルと共に配布されているドキュ メントを参照下さい。このドキュメントは、PDFlib の機能に関 する概要を非常に良くまとめており、全ての関数に関する最新のドキュ メントが含まれています。

PDFlibのほとんどの関数とPHPモジュール内の関数の名前とパラメータは 共通になっています。このモジュールを効率的に使用するには、PDFまた はPostScriptに関する基本的な考え方も理解しておく必要があります。 全ての長さと座標は、Postscriptのポイント数で計られます。通常、1イ ンチ当たり72 Postscript ポイントですが、これは、出力解像度に依存 します。使用する座表系に関するより詳細な説明については、PDFlibの ソース配布に含まれるPDFlibドキュメントを参照下さい。

ほとんど全てのPDF関数は、最初の引数パラメータとして `pdf object` を必要とすることに注意して下さ い。より詳細な情報については以下の例を参照下さい。

> 注意 PDFドキュメントを作成するための別のPHPモジュールとして FastIO's ClibPDFが利用可能です。 詳細については、ClibPDFの節を参 照下さい。ClibPDF はPDFlibとはや や異なるAPIを使用していることに注意して下さい。

# 古いバージョンのPDFlibとの混乱

PHP v4.0.5以降、PHPlib用のPHP拡張モジュールは、PDFlib GmbH から正 式にサポートされています。これにより、PDFlibマニュアル(バージョン 3.00以降)に記述された全ての関数がPHP4で全く同じ意味、同じパラメー タでサポートされています。返り値のみは、エラーの場合に `FALSE`を返すというPHPの流儀に合わせるために PDFlibマニュアルと異なっていることがあります。互換性を保つために PDFlibサポート関数ではまだ古い関数もサポートしていますが、上記の ように新しいバージョンに置換される予定です。PDFlib GmbH は、これら の古い関数を使用した場合に生じた際に生じた問題に関してはサポートを 行いません。

表 1古い関数と代替関数

古い関数 | 代替関数
--- | ---
pdf_put_image() | もう不要です。
pdf_execute_image() | もう不要です。
pdf_get_annotation() | 同じパラメータでpdf_get_bookmark()を使用。
pdf_get_font() | pdf_get_value() に2番目のパラメータとして `"font"`を渡す。
pdf_get_fontsize() | pdf_get_value() に2番目のパラメータとして `"fontsize"`を渡す。
pdf_get_fontname() | pdf_get_parameter()に2番目のパラメータとして `"fontname"` を渡す。
pdf_set_info_creator() | pdf_set_info()に2番目のパラメータとして `"Creator"`を渡す。
pdf_set_info_title() | pdf_set_info()に2番目のパラメータとして `"Title"`を渡す。
pdf_set_info_subject() | pdf_set_info()に2番目のパラメータとして `"Subject"`を渡す。
pdf_set_info_author() | pdf_set_info()に2番目のパラメータとして `"Author"`を渡す。
pdf_set_info_keywords() | pdf_set_info()に2番目のパラメータとして `"Keywords"`を渡す。
pdf_set_leading() | pdf_set_value()に2番目のパラメータとして `"leading"`を渡す。
pdf_set_text_rendering() | pdf_set_value()に2番目のパラメータとして `"textrendering"`を渡す。
pdf_set_text_rise() | pdf_set_value()に2番目のパラメータとして `"textrise"`を渡す。
pdf_set_horiz_scaling() | pdf_set_value()に2番目のパラメータとして `"horizscaling"`を渡す。
pdf_set_text_matrix() | もう使用できません。
pdf_set_char_spacing() | pdf_set_value()に2番目のパラメータとして `"charspacing"`を渡す。
pdf_set_word_spacing() | pdf_set_value()に2番目のパラメータとして `"wordspacing"`を渡す。
pdf_set_transition() | pdf_set_parameter()に2番目のパラメータとして `"transition"`を渡す。
pdf_open() | pdf_new()の後に pdf_open_file()をコールする。
pdf_set_font() | pdf_findfont()の後に pdf_setfont()をコールする。
pdf_set_duration() | pdf_set_value()に2番目のパラメータとして `"duration"`を渡す。
pdf_open_gif() | pdf_open_image_file()に2番目のパラメータとして `"gif"` を渡す。
pdf_open_jpeg() | pdf_open_image_file()に2番目のパラメータとして `"jpeg"` を渡す。
pdf_open_tiff() | pdf_open_image_file()に2番目のパラメータとして `"tiff"` を渡す。
pdf_open_png() | pdf_open_image_file()に2番目のパラメータとして `"png"` を渡す。
pdf_get_image_width() | pdf_get_value()に2番目のパラメータとして `"imagewidth"`、3番目のパラメータとして imageを渡す。
pdf_get_image_height() | pdf_get_value()に2番目のパラメータとして `"imageheight"`、3番目のパラメータとして imageを渡す。

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

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

# PDFlibの過去のバージョンに関する問題

2000/3/9以降のバージョンのPHP 4は、3.0より前のバージョンのPDFlib はサポートしていません。

一方、PHP 3 では 2.01 より新しいバージョンを使用するべきではあり ません。ただし、php3/functions/pdf.c (PHP 3.0.19) のリビジョン 1.61 以降では、PDFlib 3.0 以降を使用可能です。

# 例

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

例 1PDFlibでPDFドキュメントを作成する
    <?php
    $pdf = pdf_new();
    pdf_open_file($pdf, "test.pdf");
    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);
    pdf_delete($pdf);
    echo "<A HREF=getpdf.php>完了しました</A>";
    ?>
以下のスクリプト`getpdf.php`は、PDFドキュメ ントを返すだけのものです。
    <?php
    $len = filesize($filename);
    header("Content-type: application/pdf");
    header("Content-Length: $len");
    header("Content-Disposition: inline; filename=foo.pdf");
    readfile($filename);
    ?>

PDFlibの配布ファイルには、アナログクロックで本格的なページを作成す るより複雑な例が含まれています。ここでは、PDFlibのメモリ内作成機 能を使用しており、このため、テンポラリファイルは不要です。この例 をPHPからPDFlibを使用するように変換すると以下のようになります。 (CLibPDFモジュール)のドキュメント にも同じ例があります。)

例 2PDFlib配布ファイル中の pdfclockの例
    <?php
    $radius = 200;
    $margin = 20;
    $pagecount = 10;

    $pdf = pdf_new();

    if (!pdf_open_file($pdf, "")) {
        print error;
        exit;
    };

    pdf_set_parameter($pdf, "warning", "true");

    pdf_set_info($pdf, "Creator", "pdf_clock.php");
    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);

        /* 変化を見るために待つ */
        sleep(1);
    }

    pdf_close($pdf);

    $buf = pdf_get_buffer($pdf);
    $len = strlen($buf);

    header("Content-type: application/pdf");
    header("Content-Length: $len");
    header("Content-Disposition: inline; filename=foo.pdf");
    print $buf;

    pdf_delete($pdf);
    ?>

前のページ | ホーム | 次のページ
overload | 上に戻る | pdf_add_annotation