PDFlib-LiteをPHPで使用する

更新日 2004/11/2

PDFlibはライセンスがないと「www.pdf.com」というスタンプがつく。
そこで、PDFlib-Liteの中に、PEAR (PHP Extension and Application Repository)を利用してコンパイルすると 「www.pdf.com」といスタンプがつかなくなる。
PEARとは「PHP ユーザのためのオープンソースコードの構造化されたライブラリ」 らしい。

インストール

とりあえず、PDFLibをここからDownloadしてくる。
DownloadはPDFlib-6.0.0p1-Linux.tar.gzと、PDFlib-Lite-6.0.0p1.tar.gzをgetする。

$ tar zxvf PDFlib-6.0.0p1-Linux.tar.gz

$ tar zxvf PDFlib-Lite-6.0.0p1.tar.gz
$ cd PDFlib-Lite-6.0.0p1
$ ./configure --with-tifflib --with-zlib --with-pnglib --with-jpeglib
configが終了すると
最後にサマリーが出る。
For your convenience, here's a summary of configure's results:

Support for shared libraries:           yes
C++ language binding for PDFlib:        yes
Java language binding for PDFlib:       no
Perl language binding for PDFlib:       yes
Python language binding for PDFlib:     yes
Tcl language binding for PDFlib:        yes
PHP language binding for PDFlib:        no, see bind/pdflib/php/readme.txt
PDF import library (PDI):               no
     Note: if you purchase the additional PDF import library (PDI)
     you can also manipulate existing PDF documents with PDFlib.
     The additional block feature can be used to personalize PDF.
     See http://www.pdflib.com for details.

Please observe the licensing terms for commercial PDFlib usage.
PDFlib license agreement and purchase order can be found in the doc directory.

$ make
$ su
# make install
# exit

phpについてはbind/pdflib/php/readme.txtを見るようにあるので
それを見てpearでインストール

$ su
$ cd bind/pdflib/php
(/usr/local/bin/pearはPHPのインストールでインストールされる)
# /usr/local/bin/pear install pecl/pdflib-2.0.tgz
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/libpdf
_php.so' - /usr/local/lib/libpdf_php.so: cannot open shared object file: No such
 file or directory in Unknown on line 0
5 source files, building
running: phpize
Configuring for:
PHP Api Version:         20031224
Zend Module Api No:      20040412
Zend Extension Api No:   220040412
You should update your `aclocal.m4' by running aclocal.
path to pdflib installation? [autodetect] : /usr/local/src/PDFlib-6.0.0p1-Linux/
bind/c  <---ここにPDFlib-6.0.0p1-Linux.tar.gzで解凍したパスのbind/cを指定。
building in /var/tmp/pear-build-okada/pdflib-2.0
running: /tmp/tmp8bREb0/pdflib-2.0/configure --with-pdflib=/usr/local/src/PDFlib
-6.0.0p1-Linux/bind/c

(略)

Build complete.
(It is safe to ignore warnings about tempnam and tmpnam).

pdf.so copied to /tmp/tmp8bREb0/pdflib-2.0/pdf.so

Build process completed successfully
Installing 'pdf.so' at ext_dir (/usr/local/lib/php/extensions/no-debug-non-zts-2
0040412/pdf.so)
install ok: pdflib 2.0

# cd /usr/local/lib
# ln -s /usr/local/lib/php/extensions/no-debug-non-zts-20040412/pdf.so pdf.so

php.iniの

extension_dir = "./"
を
extension_dir = "/usr/local/lib"
に変更

extension=pdf.so
を追加

Vine3.0では

Vine3.0ではなぜか「www.pdf.com」のスタンプが入るので、/usr/local/lib/php/extensions/no-debug-non-zts-20040412/pdf.soをVine2.6で作成したをコピーすればスタンプが消えた。

確認

apacheを再起動後

以下の1行のinfo.php

<?phpinfo()?> 

でPDFセッション(pgsqlの前あたり)の確認
         pdf
---------------------------------------------------
|PDF Support            |enabled                  |
------------------------|--------------------------
|PDFlib GmbH Version    |6.0.0p1                  |
------------------------|--------------------------
|Revision               |$Revision: 1.134 $       |
---------------------------------------------------

または

$ /usr/local/bin/php -i | grep PDF
PDF Support => enabled
PDFlib GmbH Binary-Version => 6.0.0p1
PWD => /usr/local/src/PDFlib-Lite-6.0.0p1
_SERVER["PWD"] => /usr/local/src/PDFlib-Lite-6.0.0p1
_ENV["PWD"] => /usr/local/src/PDFlib-Lite-6.0.0p1


PDFlib 6.xのサンプル

pdfファイルを作成し、サーバ上に保存

<HTML>
<HEAD><TITLE>PDF Sample</TITLE></HEAD>
<BODY>
<?php
/*
このサンプルは pdf を動的に作成して、ファイル(test.pdf)に保存する、というもので
す。
*/

        // A4:X=72/25.4X210 Y=72/25.4X297 -> mm->ptに変換
        //用紙の左下が原点
        $xx=72.0/25.4*210.0;
        $yy=72.0/25.4*297.0;
        $dmm = 72.0/25.4;
        $xoffset = 0;
        $yoffset = 0;

 // test.pdf ファイルをオープン
$pdf = pdf_new();
pdf_open_file($pdf, "test.pdf");

        pdf_set_info($pdf, "Author", "JE2ISM");
        pdf_begin_page($pdf, $xx, $yy);
        $fontgo = pdf_findfont($pdf, "HeiseiKakuGo-W5", "EUC-H", 0);
        $fontmin = pdf_findfont($pdf, "HeiseiMin-W3", "EUC-H", 0);
        $fonttimes = pdf_findfont($pdf, "Times-Roman", "host", 0);


 // フォントを指定して日本語の表示
        $X = 50;$Y = 600;
        pdf_set_text_pos($pdf, $X, $Y);
        pdf_setfont($pdf, $fontmin, 32);
        $document = "日本語 平成明朝のテスト";
        pdf_show($pdf, $document);

        $X = 50;$Y = 500;
        pdf_set_text_pos($pdf, $X, $Y);
        pdf_setfont($pdf, $fontgo, 32);
        $document = "日本語 平成角ゴシックのテスト";
        pdf_show($pdf, $document);

        $X = 50;$Y = 350;
        pdf_set_text_pos($pdf, $X, $Y);
        pdf_setfont($pdf, $fontgo, 32);
        $document = "雑誌「UNIXUSER」";
        pdf_show($pdf, $document);

        $X = 50;$Y = 300;
        pdf_set_text_pos($pdf, $X, $Y);
        pdf_setfont($pdf, $fonttimes, 28);
        $document = "Times -Roman UNIXUSER PDFlib6.x";
        pdf_show($pdf, $document);



 // 四角の表示
 pdf_rect($pdf,55,650,255,150);
 pdf_stroke($pdf);

 // 線を引く
 pdf_moveto($pdf, 50, 400);
 pdf_lineto($pdf, 500, 400);
 pdf_stroke($pdf);  //線幅等を変更するときはこの行が必要

 $fWidth =2;
 pdf_setlinewidth($pdf, $fWidth);
 pdf_moveto($pdf, 50, 440);
 pdf_lineto($pdf, 500, 440);


//後処理
        pdf_stroke($pdf);
        pdf_end_page($pdf);
        pdf_close($pdf);
        pdf_delete($pdf);
        echo "test.pdf が出力されました。";


?>
</BODY>
</HTML>

PDFファイルを作成し、クライアントに転送

<?php
//サーバ上にファイルを残さないで、クライアントに送りつけるサンプル

$pdf = pdf_new();
pdf_open_file($pdf, "");
pdf_set_info($pdf, "Author", "JE2ISM");

// A4:X=72/25.4X210 Y=72/25.4X297 -> mm->ptに変換
$xx=72/25.4*210;
$yy=72/25.4*297;

pdf_begin_page($pdf, $xx, $yy);

//最後のパラメータ:フォント埋め込み 1 ,フォント埋め込ない 0
//フォント埋め込むためにはなんかまだ必要

$font = pdf_findfont($pdf, "Times-Roman", "host", 0);
pdf_setfont($pdf, $font, 16);

//用紙の左下が原点
$x = 72/25.4*10;
$y = $yy-72/25.4*15;
pdf_set_text_pos($pdf, $x, $y);

$doc = "My First PDF Document";
$size = pdf_stringwidth($pdf,$doc,$font,16.0);
$doc = sprintf("%s %f",$doc, $size);
pdf_show($pdf, $doc);

// フォントを指定して日本語の表示

$font = pdf_findfont($pdf, "HeiseiMin-W3", "EUC-H", 0);
pdf_setfont($pdf, $font, 16);

$y = $yy-72/25.4*25;
pdf_set_text_pos($pdf, $x, $y);

$doc = "日本語 平成明朝";
$size = pdf_stringwidth($pdf,$doc,$font,16.0);
$len = strlen($doc);
$doc = sprintf("%s %f %d",$doc, $size, $len);

pdf_show($pdf, $doc);

$font = pdf_findfont($pdf, "HeiseiKakuGo-W5", "EUC-H", 0);
pdf_setfont($pdf, $font, 16);

$y = $yy-72/25.4*35;
pdf_set_text_pos($pdf, $x, $y);

$doc = "日本語 平成角ゴシック";
pdf_show($pdf, $doc);

#イメージファイルのオープン
$sImgFile = "0304.jpg";
$oImg = pdf_open_image_file($pdf, "jpeg", $sImgFile, "", 0);
/*
if($oImg == False){
        echo "Couldn't open image $sImgFile <BR>";
        exit;
        }
*/

$y = $yy-72/25.4*150;
pdf_place_image ($pdf, $oImg, $x, $y, 0.7);

/*
$y = $yy-72/25.4*250;
$dx = 72/25.4*30;
$dy = 72/25.4*40;
pdf_place_pdi_page($pdf, $oImg, $x, $y, $dx, $y);
*/

pdf_close_image($pdf, $oImg);

pdf_end_page($pdf);
pdf_close($pdf);
$document = pdf_get_buffer($pdf);
$length = strlen($document);
$filename = "myfirstpdf.pdf";
header("Content-Type: application/pdf");
header("Content-Length: " . $length);
header("Content-Disposition: inline; filename=" . $filename);
echo($document);
unset($document);
pdf_delete($pdf);
?>