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

# LXXXIII. pdf 関数

# 導入

PHPのPDF関数は、Thomas Merzにより作成されたPDFlibライブラリを使用してPDFファイル を作成することが可能です。

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

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

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

# 要件

PDFlibは、http://www.pdflib.com/products/pdflib/index.html でダウンロード 可能ですが、商用で使用する場合はライセンスを購入する必要がありま す。この拡張モジュールをコンパイルするには、JPEGおよびTIFF が必要です。

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

2000年3月9日以降のバージョンのPHPでは、3.0より古いバージョンの PDFlibをサポートしていません。

PDFlib 3.0以降が、PHP 3.0.19以降でサポートされています。

# インストール手順

以下の関数が動作するようにするには、 --with-pdflib[=DIR]を指定してPHPを コンパイルする必要があります。DIRはPDFlibのベースインストールディレ クトリで、デフォルトは`/usr/local`です。 さらに、PDFlibでjpeg, tiff, pngライブラリを使用することを指定できま す。これは、PDFlib 4.xではオプションです。 これを行うには、configureにオプション --with-jpeg-dir[=DIR] --with-png-dir[=DIR] --with-tiff-dir[=DIR]を追加します。

バージョン3.xのPDFlibを使用する場合、PDFlibのconfigureのオプションに --enable-shared-pdflibを指定する必要があります。

# 実行用の設定

この拡張モジュールは設定ディレクティブを全く定義しません。

# 古いバージョンの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を渡す。

# 例

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

例 1. PDFlibで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モジュール)のドキュメント にも同じ例があります。)

例 2. PDFlib配布ファイル中の 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);
    ?>

# 以下も参照下さい:

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

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