webアプリで帳票を出力したいって場合、ファイル形式はpdfがまあメジャーだと思いますが、
pxdocという選択肢もありますよ、というエントリ。
pxdocの実体はXMLファイルであり、レイアウトをSVGで記述するのが特徴です。

SVGはInkscapeなどを使用してGUI上で作成できるので、つまり、テンプレートを作るのが簡単!

というわけで、簡単なサンプルを交えてご紹介。(今回は実装をPHPでしましたが、なんでも良いです)

まずはレイアウト作成。

サンプルなので、適当に「商品カテゴリー別売上レポート」的なの作る。

レイアウトSVG

中身はこんな感じ。

<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も引き続きダウンロードできるみたいなので、無料がいい場合はそちらをご利用ください)