弱小帳票ソリューション
帳票を手間とお金をかけずに作るには、RTFがいいんじゃないだろうか。その手順と、日本語対応について。
→PHPからRTFを出力するサンプル
お客さんから、帳票出力の要件が上がりました。しかも格安で。
どんなシステムでも帳票要件というのは鬼門で、高価な帳票ツールや、難解なPDFライブラリなどが付きまとうものです。それを「安く」なんて言われると、困ってしまいますよね。
頻繁に利用される妥協策は、CSVを出力してExcelなんかでユーザーに加工してもらう方法。でも、この方法って安易すぎると思う。
CSVを出力するのだって無料ではなくて、それなりに開発費はかかる。仮に、1時間で作れて1万円だとします。開発費が1万円で済んだとしても、ユーザーの利便性は全く向上しない。
お客さんが毎日毎日CSVをいじっている姿を想像してみてほしい。
お客さんにとって、そのナケナシの1万円は、おおよそムダ金だし、こんな提案で逃げようとするエンジニアは、まったくもって無粋だ。
だからといって私も、1万円でPDF出力をサービスするほどお人好しではナイ。そこで、思いついたのが、
1万円で、Rich Text Format(RTF)を出力する方法
RTFはご存知のとおりMS Wordなどで自由にデザイン・レイアウトできるし、ファイル形式はASCIIです。これなら、プログラムで簡単に加工できる。理屈は簡単ですよね。
Wordで適当にレイアウトを決めます。保存はRTFで。
このRTFファイルをテキストエディタで開くと、こんな風になる。
・・長いので割愛・・
\par }}
※補足:ブラケット{ }毎に改行をはさむと読みやすい。
<?php
$rtf = file_get_contents("bill.rtf");
$rtf = str_replace("}","}\n", $rtf);
file_put_contents("bill.rtf",$rtf);
?>
↑これを出力するプログラムを組みます。
具体的には、ヒアドキュメントでも使ってRTFをプログラムに埋め込んで、11111111とか2222222と書いてある部分に、任意のデータを埋め込めば、完成。
もちろん、複数データの行列表示もできます。
例えば、表の行を繰り返し表示するには、以下をfor文で回せば、行データの表示ができる(サンプルline:257)。
:
\cellx8490\row }

RTFの仕様書はMSのサイトからダウンロードできます。これを読まなくても、できたRTFをざっと見回せば、だいたいどこを弄れば良いか見当はつくかも。
SJISをRTFで表示できる形式にエンコードする必要があります。例えば、「あ」は、「\'82\'a0」となる。この変換は、PHPなら、
return "\'".implode("\'",str_split(bin2hex($s),2));
}
$rtf_enable_string = sjis2rtf($sjis_string);
で、OKです。
利点は、デザインツールがWordであること(かなり自由で簡単)。面倒なAPIを叩かなくてもいい。フォントの問題を気にしなくていい。
欠点は、帳票の改ざんやセキュリティ要件には対応できないこと。RTFの特性としてはショウガナイです。もちろんこういった要件に応えるためには、それなりに投資していただきましょう。
あとは、RTFの仕様を追うのが若干大変なこと。しかし、理解しなければならない仕様はごく一部で、一度できてしまえば、応用できることこの上ない。慣れれば何でもできそうな気がします。
繰り返しになりますが、安易にCSVソリューションに逃げることなかれ。
同じ手間でRTFをサービスしてあげたほうがダンゼン喜ばれるでしょう。

