webアプリで帳票を出力したいって場合、ファイル形式はpdfがまあメジャーだと思いますが、
pxdocという選択肢もありますよ、というエントリ。
pxdocの実体はXMLファイルであり、レイアウトをSVGで記述するのが特徴です。
SVGはInkscapeなどを使用してGUI上で作成できるので、つまり、テンプレートを作るのが簡単!
というわけで、簡単なサンプルを交えてご紹介。(今回は実装をPHPでしましたが、なんでも良いです)
まずはレイアウト作成。
サンプルなので、適当に「商品カテゴリー別売上レポート」的なの作る。
中身はこんな感じ。
<pxd paper-type="A4" fitSvg="both">
<page>
<svg width="21000" height="29700">
<rect x="1600" y="4000" width="17800" height="1200" style="stroke:none;fill:rgb(204,204,204);" />
<g style="stroke:rgb(0,0,0);fill:none;">
<rect x="1600" y="4000" width="17800" height="24000" />
<line x1="1600" y1="5200" x2="19400" y2="5200" />
<line x1="1600" y1="6400" x2="19400" y2="6400" />
<line x1="1600" y1="7600" x2="19400" y2="7600" />
<line x1="1600" y1="8800" x2="19400" y2="8800" />
<line x1="1600" y1="10000" x2="19400" y2="10000" />
<line x1="1600" y1="11200" x2="19400" y2="11200" />
<line x1="1600" y1="12400" x2="19400" y2="12400" />
<line x1="1600" y1="13600" x2="19400" y2="13600" />
<line x1="1600" y1="14800" x2="19400" y2="14800" />
<line x1="1600" y1="16000" x2="19400" y2="16000" />
<line x1="1600" y1="17200" x2="19400" y2="17200" />
<line x1="1600" y1="18400" x2="19400" y2="18400" />
<line x1="1600" y1="19600" x2="19400" y2="19600" />
<line x1="1600" y1="20800" x2="19400" y2="20800" />
<line x1="1600" y1="22000" x2="19400" y2="22000" />
<line x1="1600" y1="23200" x2="19400" y2="23200" />
<line x1="1600" y1="24400" x2="19400" y2="24400" />
<line x1="1600" y1="25600" x2="19400" y2="25600" />
<line x1="1600" y1="26800" x2="19400" y2="26800" />
<line x1="10000" y1="4000" x2="10000" y2="28000" />
<line x1="12500" y1="4000" x2="12500" y2="28000" />
<line x1="16500" y1="4000" x2="16500" y2="28000" />
</g>
<g style="stroke:none;fill:rgb(0,0,0);font-size:600;" text-anchor="middle">
<g x="1600" text-anchor="start">
<text y="2000" style="font-size:900;">カテゴリ別売上レポート</text>
<text y="3200">期間:</text>
</g>
<g y="4800">
<text x="5800">カテゴリ</text>
<text x="11250">販売数</text>
<text x="14500">販売累計額</text>
<text x="17950">割合</text>
</g>
<!--data-->
</g>
</svg>
</page>
</pxd>
最後に方に <!--data-->
って記述を入れてます。
出力時にはここにデータを埋め込みます。
(なお、サンプルなので、データは必ず1ページに収まる想定です)
そしたら後はデータを与えて出力するだけ。
<?php
// データ設定
$arry = array(
array("category"=>"オフィス用品", "count"=>163, "sum"=>816956, "per"=>26.66),
array("category"=>"電気製品", "count"=>20, "sum"=>685260, "per"=>22.36),
array("category"=>"カメラ、ビデオ", "count"=>8, "sum"=>322800, "per"=>10.53),
array("category"=>"おもちゃ、ゲーム", "count"=>62, "sum"=>291772, "per"=>9.52),
array("category"=>"ファッション、アクセサリー", "count"=>41, "sum"=>284160, "per"=>9.27),
array("category"=>"旅行用かばん、バッグ", "count"=>22, "sum"=>221760, "per"=>7.23),
array("category"=>"食品、飲料、タバコ", "count"=>320, "sum"=>218880, "per"=>7.14),
array("category"=>"ベビー、キッズ", "count"=>38, "sum"=>141428, "per"=>4.61),
array("category"=>"スポーツ用品", "count"=>14, "sum"=>75768, "per"=>2.47),
array("category"=>"その他", "count"=>6, "sum"=>5040, "per"=>0.16)
);
// 出力文字列作成
$data="";
for($i=0; $i < count($arry); $i++){
$y = $i*1200 + 6000;
$d = $arry[$i];
$s = number_format($d["sum"]);
$data .=<<<DATA
<g y="$y" text-anchor="end">
<text x="1800" text-anchor="start">${d["category"]}</text>
<text x="12300">${d["count"]}</text>
<text x="16300">${s}</text>
<text x="19250">${d["per"]}%</text>
</g>
DATA;
}
$data .= '<text x="3200" y="3200" text-anchor="start">2013-01-01~2013-01-15</text>';
// テンプレートファイル取得
$tmpl = file_get_contents("tmpl.xpxd");
// 置換
$tmpl = str_replace("<!--data-->", $data, $tmpl);
// 出力
header("Content-type: application/xpxd");
print $tmpl;
?>
うん。とってもシンプルですね!
あっという間に帳票が作れちゃいました!!
(実際の開発の際にはなんらかのテンプレートエンジンを使うとベターだと思います)
そんなわけで、なかなか便利なpxdoc。
難点を挙げるなら、クライアントがwindows限定ってところと、
PXDoc2になってから有料ライセンスに移行したとこくらいですかね…。
(無料のPXDoc1も引き続きダウンロードできるみたいなので、無料がいい場合はそちらをご利用ください)