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から生成する手順をメモする(もちろんマルチバイト対応で)。

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

2006/04/10 | PDF関連

MBFPDFの話題から始めようと思ったけど、仕事で使う必要がでた「既存PDFに値をはめ込んで・・・」という機能について先にメモする。MBFPDFについても使用経験があるので、おいおいまとめる。
さて表題の件だが、FPDFをベースに使用するのだが、FPDFはPDFを新規生成することはできるけれど「既存PDFを読み込んで・・・」ということはできない。これを実現するにはFPDIというライブラリを使用する。そしてこれらからマルチバイトに対応するためにMBFPDFおよびFPDIを日本語対応させるパッチも利用する。ダウンロードはこちらから。
FPDF
FPDI
MBFPDF
パッチ

ただし廣川さんのパッチはgzという拡張子はついてはいるが、テキストファイルになっているので注意が必要かも(apacheがgzに対応しているから?、詳細不明・・・)。
まず適当なディレクトリに上の3つのファイルを適当なディレクトリ構成で解凍し、さらにパッチファイルをあてる。mbfpdfは解凍したものをfpdfディレクトリに上書きして使用するとよい(はず)。パッチファイルをあてるにはmbfpdf.phpをベースにするので、これをMBfpdi.phpという名前でコピーしておいてパッチをあてる。

ここまでで準備が完了となる。実際のプログラムは次の記事でメモする。
ちなみに廣川さんのサイトはこちら

PHPでPDFを生成する

2006/04/10 | PDF関連

PHPからPDFを生成するのに有名なツールとしてPDFlibというライブラリがある。PDFlib単体ではPDFの生成をサポートし、オプションとしてPDIというツールがあり(他にもたくさんある)、これを使うと既存PDFを読み込んで、データを埋め込んだPDFを作成するといったことができる。これができると、帳票などはエクセルやワードで作成し、データの埋め込みのみPHPからできるので、簡単に帳票をデザインすることができる。しかしPDFlibは商用利用は有償で単体で73,500円、PDIを加えると147,000円となり敷居が高くなってしまう。
ではその他の選択肢は・・・、となるといくつか手法がある。自分が知っているだけで以下の3つ。
(1) Texでデータを作成し、PDFに変換
(2) PHPでJAVAモジュールを有効にし、JAVAの豊富なライブラリを使用する
(3) PHPからPDFを生成するライブラリを使用する

(1)は自分が昔使っていた手法。Texでフォーマットした文書ファイルをghostscript(だったっけ?)をつかってPDFに変換する。ただしこの手法を使うには少なくともTexに関する知識も必要になるし、サーバにコマンド群をインストール・設定する必要もでてくる。決して敷居が低いとはいえない。

(2)はアシアルが「PHPプログラマーズマガジン」を生成する場合などに使用している(らしい)。JAVAの豊富なライブラリが使えるのでPDF生成に限らず有効な手法だが、やはりJAVAの知識が必要になってくると思われるので敷居は低くないだろう。

結果として(3)が最も簡単な方法になる。多分、今日本で一番使われていると思われるのがFPDFといわれるライブラリ(FPDF-J)。もともとFPDF自体はマルチバイトに対応していないけれど、拡張クラスを使用してマルチバイトが使用できるようになっている。それらはFPDF本家で作られた「FPDF_japanese」とairwhile氏が作成した「MBFPDF」だ(ただし現在MBFPDFへのリンクが見つけられず広川さんのサイトから取得できる模様MBFPDF 1.0b)。

このカテゴリでは(3)の手法を使用して、PHPからPDFを生成する手法をメモしていくことにする。

【続】initializeでfalseが返されたら

2006/04/09 | mojavi2

表題の件は前回の続編だが、予想通りでした。
mojavi-all-classes.phpのExecutionFilterクラスの中の以下の記述で

if ($action->initialize($controller, $request, $user))

else節を加えて「$controller->forward(ACTION,MODULE)」を書き足すことによって希望のモジュール/アクションに遷移させることができると判明。
ここでさらなる野望。
これまではデータベースへの接続をベースとなるアクションclassを作成し、そのinitialize関数の中でおこなってきたので、データベース接続が失敗したときのエラー表示を美しくしたかったのだけれど、少し欲求が増えた。ぜひともこれをFilterで実現したい。
つまりFilterでデータベースの初期化をおこない、初期化に失敗した場合に単にエラーメッセージを表示するだけでなく、カスタマイズされた画面中にエラーを表示させたい、ということ。
いろいろ調べたけれど今のところわからない。どうすれば実現できるのか、わかる人がいれば是非教えて欲しい。

Read the rest of this entry »


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