PDF作成ライブラリ (FPDF + FPDI + MBFPDF + Rotations)
Tabsメニューをみた通り、Windows MobileやWindowsツールの話題が中心で、ブログタイトルに直接関係したエントリーがほとんどありません。ということで、ここらで一つPHPのライブラリのネタを立てておこうかと思います。
?
で、PDFを扱うフリーのPHPライブラリにはFPDFがありますが、その導入について決定的だと思えるブログ記事がないように思えないので、これをエントリーとします。
何を持ってそう思うかというと、まず、このライブラリを使いこなすには最低限次の3つが必須だと思うのですが、これをセットで紹介している記事は少ないこと。
- 日本語対応の拡張クラス
- 差込印刷のためのテンプレート拡張クラス
- 文字回転の拡張クラス
そして、日本語対応クラスにはjapanese.zipとMBFPDFの2つがあるのですが、どちらを使うべきか断じていないことです。
結論を言えば、MBFPDFを使うべきで、3つの拡張クラスを紹介している記事があってもjapanese.zipをベースにしている点で不足していたりしました。
fpdf.orgでJapanse supportをクリックすると、筆頭にはOliver氏自身による japanese.zip があり、おまけの「代替エクステンション」としてMBFPDFに外部リンクが張ってあります。これだと、権威に弱い日本人は 正規配布品に目が行きがちです。
中身を見れば一目瞭然ですが、japanese.zipは日本語対応のサンプル程度の完成度で、フォントはP明朝しか扱えません。ほかのフォントが必要ならコードを真似して追加する必要がありますが、その方法を紹介する記事は見当たりません。
なぜ無いか?・・・簡単なことです。MBFPDFを使えば最初から明朝、P明朝、ゴシック、Pゴシックが扱えるので、誰も(すでに実務で利用している人は)そんな面倒なことをしてないからです。
?
2番目の差込印刷クラスですが、何か特別な機能のように考える方もおられるかもしれませんが、罫線を含めたすべての出力をPHPで作成するのは現実的ではなく、あらかじめ作成したテンプレートPDFに動的文字だけを重ね合わるのが賢明です。
PDF作成には、Open Office.org CalcまたはDrowがあれば他にツールは必要ありませんし、相性もよいようです。Excel+Acrobatなどで作成したPDFを私自身は試していませんが、Open Office.org以外のPDFとの相性に問題があるとレポートしているWeb記事もあります。
文字回転クラスは縦書きで印刷するとき以外にも、用紙を横配置したときにも必要になります。小さなライブラリですから、常に組み込んでおくことに異論はないでしょう。
?
FPDFのインストール手順
■インストール先
今回のように、パッケージシステムに依存しないアプリケーションを自分でインストールする場所は、FHS標準規格では /usr/local 以下?です。/usr/local/lib/php が存在しますので、サブディレクトリにfpdfまたはpdfを作ってインストールします。
/usr/local/lib/php/fpdf
?
■ダウンロードするファイル
ダウンロードするのは以下の通りです。すべて /usr/local/lib/php/fpdf に(それ以上サブディレクトリを作らず)解凍します。
?
| サイト | 拡張クラス | ダウンロード手順 |
|---|---|---|
| fpdf.org | FPDF | Downloadsから、v1.6のZIPまたはTGZをダウンロード |
| MBFPDF | トップページのJapaneseリンクから、Noteの外部リンク | |
| Rotations | Scriptsから | |
| SETASIGN | FPDI, FPDF_TPL | Downloadsから |
?
■ファイルの修正
MBFPDF, Rotations, FPDIはそれぞれが並列したFPDFの拡張クラスとして、たとえばMBFPDFをインクルードすればFPDFがインクルードされたことになるように書かれています。
これをMBFPDFをインクルードしたら残りのすべてが使用できるよう、紐付けを書き直します。FPDIからはデフォルトのままなので修正するのは次の赤矢印の部分です。
MBFPDF → Rotations → FPDI → FPDF_TPL → FPDF
?
MBFPDF
11: require('fpdf.php'); ? ? ? ? ? ?// Original Class
:
40: class MBFPDF extends FPDF
以下に修正
11: require('fpdf.php'); // Original Class
12: require('rotation.php'); // ★追加
:
41: class MBFPDF extends PDF_Rotate // ★修正
rotation.php
2: require('fpdf.php');
3:
4: class PDF_Rotate extends FPDF
以下に修正
2: require('fpdi.php'); // ★修正
3:
4: class PDF_Rotate extends FPDI // ★修正
?
これでMBFPDFをインクルードすればすべてのライブラリが利用可能になります。このまま使用しても良いのですが、自分なりの用途にあわせて専用クラスを作成すると使いやすくなります。
?
■ユーザーPDFクラス
年賀状印刷用に作成したPDF出力クラスです。
あて名書きでは、横書き(text_horizontal)、縦書き(text_vertical)の他に、縦置き用紙に横書きするため90度回転(text_rotate)も必要とされ、縦書きでは数値の漢数字化と文字単位での270度回転や位置調整が必要でした。印字位置に収めるため、最大長に応じて文字サイズを自動調整するようにもしてあります。
何を印刷するにしても不足のないライブラリになっているのではないでしょうか。
?
使い方は次のようになります。
<?php
define('MY_FPDF_PATH', '/usr/local/lib/php/fpdf');
define('MY_ENCODE', 'SJIS');
include_once 'class/pdf.inc.php';
// クラス初期化と用紙サイズ指定
//(引数と省略時の初期値)
// $orientation="P", $unit="mm", $format="A4", $families=array(PMINCHO)
$o_pdf = new my_class_pdf("P", "mm", "Postcard", array(GOTHIC, PGOTHIC));
// ページ追加
// $family=PMINCHO, $template=""
$o_pdf->add_page(GOTHIC, "nenga.pdf");
// 水平
// $x, $y, $size, $text, $max_width=0, $align="left", $space=0, $style="", $family=""
$o_pdf->text_horizontal(46.2, 18.0, 13, "163", 0, "left", 4.6);
$o_pdf->text_horizontal(67.7, 18.0, 13, "8001", 0, "left", 4.6);
// 垂直
// $x, $y, $size, $text, $max_height=0, $valign="top", $space=0, $style="", $family=""
list($size) = $o_pdf->text_vertical(92, 30, 12, "東京都新宿区西新宿1-8-1", 90);
$o_pdf->text_vertical(86, 30, $size, "第一本庁舎15F北", 90, "bottom");
$o_pdf->text_vertical(76, 30, 15, "東京オリンピック・パラリンピック招致本部", 90);
$o_pdf->text_vertical(70, 40, 15, "招致推進部", 80);
list($size, $y) = $o_pdf->text_vertical(60, 30, 20, "東 京太郎 様", 90, "middle", 2, "B");
$o_pdf->text_vertical(50, $y, $size, "〓 花子 様", 0, "top", 2, "B");
// 2ページ目
$o_pdf->add_page(PGOTHIC, "nenga.pdf");
// 90度回転
$x = 50;
$o_pdf->text_rotate90($x, 100, 14, "President Barack H. Obama, Jr.", 70, "left", "B");
$x += 6;
$o_pdf->text_rotate90($x, 100, 11, "The White House", 70);
$x += 10;
$o_pdf->text_rotate90($x, 100, 11, "1600 Pennsylvania Avenue NW", 70);
$x += 5;
$o_pdf->text_rotate90($x, 100, 11, "Washington DC 20500, USA", 70);
// 出力
// $name="doc.pdf", $zone="default"
$o_pdf->output("address.pdf", "real");?
?>
出力結果です。
これはプレビュー用で、本番のあて名印刷ではテンプレートを省いて無地出力します。
調整後のフォントサイズと段落基点は返り値で得られるので、次の行のサイズと位置調整に利用できます。
サンプルでは、団体名がリサイズされ、連名がセンタリングしたあて名にそろっています。


1/20 '09 4:40 PM
はじめましてFPDFで検索をしまして到達いたしました。
PHPを初めて使って印刷をしようと、なんとかFPDFの存在を知ってなんとか動くようになりました。
とてもわかりやすくまとめていただきまして感謝いたします。
とっても助かりました。
ありがとうございます
1/20 '09 10:45 PM
お役にたって何よりです。
1/26 '09 11:57 AM
pdf.inc.php.txtがInternal Server Errorになってるのですが、何が読み込まれるのでしょうか。よろしければ教えていただければと思います。
1/26 '09 1:16 PM
googleのキャッシュから読み込むことが出来ました。
ご迷惑おかけしました。
1/26 '09 2:55 PM
家サーバーメンテのため「さくら」に避難してたのですが、pdf.inc.php.txtというファイル名ではテキストとして処理されないようです。
pdf_inc_php.txtとしてリンクしておきましたので、ファイル名は適当に直してください。
5/3 '09 8:57 PM
「FPDF ハガキ印刷」で検索してこのサイトを見つけました。
私のやりたいことはまさにこの宛名印刷です。
サイトを参考にがんばってみましたが、
どうもうまくいきません。
windows環境だから
define(‘MY_FPDF_PATH’, ‘/usr/local/lib/php/fpdf’);
を変更すればいいかと思い、変更してもどうもうまくいきません。
ご教授ください。
いろいろいじって最終的に
FPDF error: Cannot open nenga.pdf !
というメッセージがでてきました。
5/12 '09 2:27 AM
[...] これもまあ、FPDFとかを使えばできそうです。現状ではWord+クセロPDFでやってもらってるんですが、全然集まりません。いちいち「PDFとして印刷する」という工程を経ずしてPDFを配布で [...]
9/15 '09 2:49 AM
はじめまして。FPDFによる印刷でこちらのサイトにたどり着きました。こちらの環境はPHP5なのでしょうか?PHP4(試したのは4.4.2です)ではpdf.inc.phpでエラーが出てしまうようです。
9/16 '09 12:34 AM
こんばんは。自己解決できました。pdf.inc.phpを見ると、public指定があったので、PHP5であることが調べてみて分かりました。早速予備のマシンでPHP5をインストールして試したところ、動作はしました。ただ日本語の住所や氏名を縦に並べる際に詰まった状態でPDF出力されるので、マルチバイト関係の処理で修正を若干してあげる必要がありますので、あとはこちらで直したいと思います。ありがとうございました。このあとHTML2FPDFで普通に変換できれば完成です。
9/16 '09 1:01 AM
おかげさまで無事解決しました。ソースに抜けているものがありました。他の方も参考にされると思いましたので、一応訂正箇所を書いておきます。
define(‘MM_PER_POINT’, (25.4 / 72.0));
です。MM_PER_POINTの定義が抜けてました。あとは、MY_FPDF_PATHがMY_FPDF_DIRに訂正と、MY_ENCODEをMY_ENCODINGに訂正です。
自分の環境はEUC-JPですので、
define(‘MY_ENCODING’, ‘EUC-JP’);
と訂正することで見事PDF表示されました。
なお、試した環境ですが、
apache(1.3.29)
PHP5(5.2.10)
になります。ご参考まで。
MM_PER_POINTの部分は見つけるまで少し時間がかかりましたが、結果オーライということで満足しています。あとはこれをうまくカスタマイズして使ってゆきたいと思っています。本当にありがとうございました。
9/17 '09 10:41 AM
コメントするまに自己解決されたようで恐縮です。
詳しいレポートありがとうございました。
9/20 '09 11:25 AM
こんにちは。
個人または家族で使える自宅用のWebポータルシステム「MyHome Portal」をオープンソースとして公開しています。
http://ok2nd.web.fc2.com/
この「MyHome Portalの新コンテンツ「住所録」で、pdf.inc.phpを利用させていただきました。
http://ok2nd.blog87.fc2.com/blog-entry-125.html
また、FPDFの環境設定についても参考にさせていただきました。
pdf.inc.phは、文字サイズの自動調整など素晴らしいライブラリです。Windows環境でも問題なく動作しています。ありがとうございました。
5/3 '10 8:11 AM
pdf_inc_php.txtがInternal Server Errorになってしまいす。
キャッシュで開いても同様な現象になって
しまいます。
何が読み込まれるのでしょうか。よろしければ教えていただければと思います。
5/24 '10 4:14 PM
pdf.inc.phpを改めて公開していただけないでしょうか。
ご検討お願いいたします。
5/25 '10 3:53 PM
サーバー移転のURLリダイレクトがうまく機能してなかったですね。
リンク先を変更しておきました。
5/26 '10 11:30 AM
y.mikome様
ご対応いただきありがとうございます。
さっそく活用させていただきます。
本当にありがとうございました。
5/27 '10 5:33 PM
活用させていただきましたところ ここのコメント6番さんと同じ現象
FPDF error: Cannot open nenga.pdf !
が表示されて対応に行き詰っています。
パーミッションは777としていますが
PDFファイルが出来ていないようです。
何かヒント頂けたら幸いです。
7/6 '10 11:58 PM
[...] 1つ目のコツコツ座標を指定してオブジェクトを配置する方法はここに詳しい。FPDFやFPDIやらMBPDFやらのライブラリを落としてきたりと準備が面倒なのだが、ここに全部がひとまとめにな [...]
7/23 '10 1:03 PM
[...] PDF作成ライブラリ (FPDF + FPDI + MBFPDF + Rotations) ? Rapid Express [...]