PHPからPDF出力

2011/05/01 | PDF関連

ウェブから印刷用データを配布するのに、久しぶりにPDF出力を試してみた。昨今はCSSである程度の制御もできるようだが、やはりPDFの表現力にはかなわない。

以前はmbfpdfを使用していた。完全にやり方を忘れていたというのもあるし、日本語を簡単に扱いたいというのもあるし、新しいものに触れてみたいというのもある。そして検索で行き着いたのがTCPDF。

TCPDF

これ結構すごい。fpdfから拡張したようなのだが、最初からマルチバイト文字列が使えるようになっている(UTF-8)。日本語フォントも含まれているので、何も手を加えずともそのまま日本語のPDFファイルを作ることが出来る。

そしてfpdfのメソッドがだいたい組み込まれているようで、fpdfからの移植にほとんど手間がかからなかった(最初はfpdfでつくっていたのだが、将来的に日本語も使いたいので、一旦作ったプログラムを移植した)。

後はフォント。利用制限のない日本語フリーフォントでよさげなものを探すことにする。

画像を作って日本語文字列を表示

画像を操作する関数としてGD関数群が用意されている。で、それらの関数を使うと、拡大とか縮小とかトリミングとかいろいろできる。さらに画像の中に文字を書き込むこともできる。でもって、さらに、マルチバイトな文字も書き込むことができる。それがimagettftext関数だ。

imagettftext ( resource image, float size, float angle, int x, int y, int color, string fontfile, string text )

ただし、一手間かけないといけない。7つ目の引数「フォントファイル」の指定だ。たいていの場合、レンタルサーバにはそんなものは用意されていないので、自前で準備する必要がある。で、使えるフォントはこちらのがいいようです。

M+とIPAフォントの合成フォント

請求書フォームとかPDF出力したりするのにもつかえそう。

SSL環境下でPDF出力

2006/04/20 | PDF関連

IEにはバグがあり、SSL通信下ではキャッシュを保存されないように設定されたヘッダを受け取るとファイルのダウンロードができない。これはPDFやFlashで再現するのを確認した。
今回mojaviをSSLで使用し、PDFで出力する必要があったのでヘッダのパターンを検証してみた。

○パターンその1(エラー)
(ヘッダ指定なし)

○パターンその2(エラー)
header(‘Cache-Control: ‘);

○パターンその3(ダウンロードダイアログ表示)
header(‘Pragma: ‘);

○パターンその4(インラインで表示成功)
header(‘Cache-Control: ‘);
header(‘Pragma: ‘);

ちなみにパターンその3で、ダイアログ表示のファイル名の部分は正しく「new.pdf」となっていたが、パターンその4で一旦インライン表示してから保存しようとするとファイル名の部分がURLとなっていた。インラインで表示できて、かつ保存する際のファイル名も正しく表示できるよう設定するにはどうしたらいいものか、もう少し検討が必要だ。

ちなみにこの件のMicrosoftのナレッジベースはこちら

PHPでPDF(整理)

2006/04/11 | PDF関連

FPDI他PDF関連ライブラリについて整理していく上で、昔自分がやったことを徐々に思い出していくと、少し勘違いがあったみたいなので、ちょっと整理してみる。

○FPDF(PHPでPDFを扱うライブラリ)
PHPでPDFを扱うことができて、無償で、ピュアPHPで書かれている、現状もっとも使いやすいライブラリ。PHPではこれを使用してPDFを生成します。

○FPDI(既存のPDFファイルを、新しいPDFに埋め込むためのライブラリ)
素のFPDFでは、帳票生成などPDFのベースとなるファイルを別途エクセルなどで作ってそれを埋め込むということはできない。FPDIはそれを実現するためのライブラリ。FPDFの拡張版。

○MBFPDF(FPDFで日本語を扱えるようにするライブラリ)
FPDFを継承して日本語を扱えるようにしたライブラリ。FPDF本家でもマルチバイト対応ライブラリが作成されているが、それとは別にairwhile氏が作成した(現在は作者はメンテナンスを終了している)。

○MBfpdi(FPDIとMBFPDFを拡張したもの)
MBFPDFとFPDIを拡張して、日本語を使用でき、かつ新規PDF生成時に、ベースとなるPDFを埋め込むことができるライブラリ。つまり、このライブラリはFPDF、FPDIを拡張し、かつMBFPDFの日本語機能を使えるようMBFPDFに廣川氏作成のパッチを適用したもの、といえる。

よってMBfpdiが利用できる環境を構築できれば、それで日本語PDF生成環境は構築完了となる。PDF上に罫線を引いたり、文字をかいたりするにはFPDFのマニュアルを参照すればおおよそ事足りると思われる。

【続】準備したPDFテンプレートに文字を埋め込む

2006/04/10 | PDF関連

サンプルを使用して日本語を埋め込んでみる。サンプルプログラムはFPDIのサンプルを使用した(このページの一番下)。

<?php
[01] define(‘FPDF_FONTPATH’,’font/’);
[02] require(‘fpdi.php’);
[03]
[04] $pdf= new fpdi();
[05]
[06] $pagecount = $pdf->setSourceFile("orig.pdf");
[07] $tplidx = $pdf->ImportPage(1);
[08]
[09] $pdf->addPage();
[10] $s = $pdf->useTemplate($tplidx,10,10,90);
[11]
[12] $pdf->SetY(10);
[13] $pdf->SetFont("Arial");
[14]
[15] // write all fetched Informations of the PDF document
[16] foreach($pdf->current_parser->infos AS $k => $v) {
[17]  $pdf->SetX(10 + $s[‘w’]);
[18]  $pdf->Cell(0, 6, $k .": ".$v, 0, 1);
[19] }
[20]
[21] $pdf->SetXY(10 + $s[‘w’], $pdf->y + 6);
[22] $pdf->Cell(0, 6, "Page count: ".$pdf->current_parser->page_count." pages");
[23] $pdf->SetXY(10 + $s[‘w’], $pdf->y + 6);
[24] $pdf->Cell(0, 6, "PDF-Version: ".$pdf->current_parser->pdfVersion);
[25] $pdf->Output("new.pdf","I");
?>

便宜上行番号をつけてある。
[01]これはいらない(コメントアウト)。
[02]ここはパッチをあてた「MBfpdi.php」を読み込むよう変更。
[13]ここでフォントを指定しているので、これを日本語用に変更する。
[13]をコメントアウトし以下の2行を加える。

(1) $pdf->AddMBFont(KOZMIN ,’SJIS’);
(2) $pdf->SetFont(KOZMIN);

やることはこれだけ。これで日本語を表示させることができるようになる。ちなみに(1)で’SJIS’と指定しているので、埋め込みはSJISでおこなう(EUCにする場合はそのように指定すること)。「KOZMIN」というのはフォントの指定だ。もちろん他にも使用できる。これについてはインストールで使用した各ライブラリに目を通せば理解できるはず。あと各ライブラリへのパスの設定も必要ですよ。

とにもかくにもこれでPDF生成ができる。手順が入れ替わったけど、次回はPDFを1から生成する手順をメモする(もちろんマルチバイト対応で)。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net