ruby + Thinreports で PDF 出力
例えば、ruby + Thinreports を使えば、
のような請求書が簡単に作れる。これは『高度な一覧表』のサンプルとほぼ同様のものだ。
ところが、このレイアウトでページあふれが生じると、
の様になってしまう。これはまずい。
何がまずいかというと、『記』『以上』でくくっているはずの明細の途中に、改ページ毎に『記』が書かれてしまうのだ。『記』は最初だけ、『以上』は最後にだけ表示されなければいけない。
これを避けるために複数レイアウトを組み合わせてみたが、うまく行かなかった。最初のオーバーフロー時に余計なページが挟まってしまうのだ。それを避けるためにトップページのオーバーフローを抑止すると、今度は途中に『以上』が挟まってしまう。
で、泣きそうになりながら作ったのが、
だ。レイアウトは1つにして、2ページ目以降では邪魔な部分の表示を抑止するようにした。
実際の帳票では、
のように空白行を入れてフッター位置を調整するのが普通なので、さらに調整してみた。
ファイル一式をここに置く。
2ページ目以降でヘッダーの出力を抑止しているのは
report.events.on :page_create do |e| # Set page-number. e.page.list(:default).header.item(:Page).value(”Page: ” + sprintf(”%02d”, e.page.no)) if e.page.no > 1 report.page.list(:default).header do |header| header.item(:Customer).hide header.item(:Fix01).hide header.item(:Fix02).hide end end end
といったルーチンだ。ページ生成イベントで2ページ目以降の時、非表示にしている。
最終ページで空白行を挿入してフッターの位置合わせをしているのは
maxLine = 37 # オーバーフローする行数 minLine = 34 # フッター表示時の行数 amari = itemNo % maxLine # 最終ページの行数 if amari > minLine (amari - maxLine).upto(minLine - 1) { report.page.list(:default) do |list| list.add_row do |r| end end } elsif amari < minLine amari.upto(minLine - 1) { report.page.list(:default) do |list| list.add_row do |r| end end } end
という、なんだかいい加減なルーチンである。出力した行数を基に計算している。
もっと賢い方法があるのだろうが、flymanはググってもたどり着けなかった。
まだまだ機能不足なThinreportsだが、工夫すれば使えそう。
でも、欲しい機能も一杯 ――
バンドを増やして欲しい
ボディ・ヘッダー
グループ・ヘッダー
明細ヘッダー
明細
明細フッター
グループ・フッター
ボディ・フッター
など。
各種プロパティをダイナミックに変更可能に。例えばバンドの高さとか。
要は、QuickReportsやRaveReports のようなレポート作成ツールの機能に迫って貰いたい。フリーじゃ無理かも知れないが、なるべくフリーのままで。バージョンアップに期待
TrackBacks
TrackBack URL : http://www.kestrel.jp/modules/wordpress/wp-trackback.php/926
この投稿には、まだコメントが付いていません