竹形誠司 ブログ
Java+MySQL+Tomcat    »トピック一覧
掲示板へのスパムが多いため、「ご質問」のコーナーはユーザー登録制とさせていただきました。お手数ですが、上の「新規ユーザーの登録」メニューより登録をお願いします。
帳票Web
アプリケーション

受注開発始めました
詳しくは こちら
竹形 誠司 著/ラトルズ刊
JSP帳票アプリケーション実践開発入門
JSP帳票アプリケーション
実践開発入門

JSP業務アプリケーション短期開発入門
JSP業務アプリケーション
短期開発入門

Java+MySQL+Tomcatで始めるWebアプリケーション構築入門
Java+MySQL+Tomcatで始めるWebアプリケーション構築入門

Java+MySQL+Tomcatで作る掲示板とブログ
Java+MySQL+Tomcatで作る
掲示板とブログ
iTextを使ってPDF帳票を出力するためのラッパー
by 竹形 誠司[takegata]
【新しいバージョンのiTextに対応した記事を以下に書きました】
http://www.orquesta.org/takegata/Article/ArticleView.jsp?article_id=796
----2011/4/20 追記----

JavaでPDF文書を出力するにはBruno Lowagie氏とPaulo Soares氏によって開発されたiTextを使うことができますが、用意されているクラスがかなりプリミティブなものなので、帳票を作るには結構苦労します。そこで、XMLで表のテンプレートを定義して、簡単にデータを埋め込めるようなラッパーを作ってみました。

テンプレートは次のような感じです。
<?xml version="1.0" encoding="Windows-31J"?>
<document size="A4P">
    <table cols="3" widths="5 2 5">
        <tr>
            <td>項目</td>
            <td>単価</td>
            <td>数量</td>
            <td>金額</td>
            <td>税</td>
        </tr>
        <tr>
            <td id="item0"></td>
            <td id="price0" align-h="right"></td>
            <td id="qty0" align-h="right"></td>
            <td id="amount0" align-h="right"></td>
            <td id="tax0" align-h="center"></td>
        </tr>
        <tr>
            <td id="item1"></td>
            <td id="price1" align-h="right"></td>
            <td id="qty1" align-h="right"></td>
            <td id="amount1" align-h="right"></td>
            <td id="tax1" align-h="center"></td>
        </tr>
        <tr>
            <td id="item2"></td>
            <td id="price2" align-h="right"></td>
            <td id="qty2" align-h="right"></td>
            <td id="amount2" align-h="right"></td>
            <td id="tax2" align-h="center"></td>
        </tr>
    </table>
</document>
document要素の中にtable要素、table要素の中にtr要素、tr要素の中にtd要素を定義します。データの入る場所にはtd要素のid属性でラベルを貼っておいて、ラベルと値をHashMapでラッパーに与えると表の中にその値が差し込まれます。こんな感じです。

class Test{
    public static void main(String[] args) throws Exception{
        File fileXml = new File("estimate.xml");
        DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        org.w3c.dom.Document xmlDoc = db.parse(fileXml);
        org.w3c.dom.Element eleDoc = xmlDoc.getDocumentElement();
        PdfDocumentWrapper doc = new PdfDocumentWrapper();
        doc.setElement(eleDoc);
        doc.setOutputStream(new FileOutputStream("estimate.pdf"));
        HashMap<String,String> hmValues = new HashMap<String,String>();
        hmValues.put("item0","商品1");
        hmValues.put("price0","100");
        hmValues.put("qty0","1");
        hmValues.put("amount0","100");
        hmValues.put("tax0","税別");

        hmValues.put("item1","商品2");
        hmValues.put("price1","100");
        hmValues.put("qty1","1");
        hmValues.put("amount1","100");
        hmValues.put("tax1","税別");

        hmValues.put("item2","商品3");
        hmValues.put("price2","200");
        hmValues.put("qty2","2");
        hmValues.put("amount2","400");
        hmValues.put("tax2","税別");

        doc.setValues(hmValues);
        doc.process();
    }
}
以下はラッパー本体(PdfTable.jar)とサンプルコード(Test.java)をzipしたものです。test.bat(Windows以外の場合はシェルスクリプトに書き直してください)を実行してみてください。同じディレクトリ内に帳票のPDFファイルが出力されます。(2009/1/21追記:Java 1.5 で実行できなかったので、-target 1.5 を入れてコンパイルしなおしました。)

帳票作成プログラムサンプル帳票作成プログラムサンプル
sample1.zip


テンプレートの書式とラッパーのソースは次のzipファイルに入れておきました。

PrintTableソースPrintTableソース
src.zip


もう少し手を入れて、より使いやすいものに仕上げていきたいと思います。
ご意見、ご感想、ご質問などあればコメントをお寄せください。

iTextは以下のサイトからダウンロードできます。
http://www.lowagie.com/iText/

投稿:竹形 誠司[takegata]/2009年 01月 20日 05時 14分 /更新:2011年 04月 21日 17時 35分
RE:iTextを使ってPDF帳票を出力するためのラッパー
by ms_naka[nakaso]
竹形誠司様
過日、MYSQL BLOBやブログで、多大なお手数をお掛けしましたが、今回もまた、
JDK1.5環境専用のソースを送信していただき、有難うございました。
まったく、問題もなく、PDFファイルができております。先生のテンプレートの応用使用で、PDF印刷が、出来そうです。
JAVA PDFで、他の Webページ紹介も散見されますが、これだけ、親切で、実用的な事例はありませんでした。感謝申し上げます。
迅速で、返事をいただけるのが、なによりも、うれしく思っております。
当方、相変わらず、初心者レベルですが、今回もまた、java -cpコマンドやPDF関連を調べる機会を得ました。でも、一つ一つ勉強と思っております。
先ずは、確認連絡にて。有難うございました。



投稿:ms_naka[nakaso]/2009年 01月 22日 10時 01分 /更新:2009年 01月 22日 10時 06分
RE:iTextを使ってPDF帳票を出力するためのラッパー
by 竹形 誠司[takegata]
コメントありがとうございます。
いろいろ指摘していただけると、こちらも助かりますし、
何よりやる気が出ます。
これからもよろしくお願いします。
投稿:竹形 誠司[takegata]/2009年 01月 22日 13時 16分 /更新:2009年 01月 22日 13時 16分
RE:iTextを使ってPDF帳票を出力するためのラッパー
by ms_naka[nakaso]
続報
1)早速、ラッパーのXMLをカスタマイズし、項目数を増加させて見ました。
まだ、ラッパーでのカラムの幅、フォント、文字数との関係など、詳細
は、理解しておりませんが、先生から、指示を頂き、上記、実行できました。
このテンプレートを上手に利用し、要素項目を本体プログラムの簡単な実装で、印刷可能な定型文書を効率的に制作できる様になります。
うれしく思っております。他のWEBページでも、一々プログラムを作らず、テンプレート方式が望まれると意見を拝見いたしており,他の方にも、有用とかんがえております。
尚、先生には、以前から、itextによるプログラム紹介ページなど、多くあったのですが、見逃しており、ラッパープログラム投稿で、初めて知ったしだい。初心者とは言いながら、恥の極みです。
加えて、java -cp とjavac -cp を勘違いし、本当に恥ずかしい思いをしました。
この様な場に投稿するには、おこがましい超初心者で、先生にはご迷惑をおかけしましたので、お詫び申し上げます。
2)先生の紹介された、itext ホームページには、多数のサンプルソースが
ありました。その中で、ImageCellは、テーブルに写真を埋め込むアルバム
形式のものであり、カラムの日本語表示には、てこずりましたが、何とか
プロトタイプのPDFアルバムができました。初心者には、最適なソースが多く、ありましたので、報告しておきます。
**table.addCellでの日本語表示コード例**
[ BaseFont bf  =BaseFont.createFont("HeiseiKakuGo-W5","UniJIS-UCS2-H",false);

table.addCell(new Phrase("荒島岳登山口",new Font(bf,12))); ]


投稿:ms_naka[nakaso]/2009年 01月 26日 23時 14分 /更新:2009年 01月 26日 23時 14分
RE:iTextを使ってPDF帳票を出力するためのラッパー
by 竹形 誠司[takegata]
竹形です。どうも。

iTextを使ってでPDF帳票を出力するには、iReportなどの高機能なものもありますが、結構使い方が難しくて敷居が高いんですよね(と、私は思います)。

今回公開したラッパーは、セルを縦に結合することができないなど、機能的に十分なものではありませんが、HTMLのテーブルの感覚でテンプレートを作れるので、簡単な帳票を手っ取り早く作りたい場合には便利なのではないかと思います。

また何か気が付いたらコメントをお願いします。
投稿:竹形 誠司[takegata]/2009年 01月 26日 23時 40分 /更新:2009年 01月 26日 23時 40分
RE:iTextを使ってPDF帳票を出力するためのラッパー
by ms_naka[nakaso]
先般、竹形先生より、PDFラッパーのリリースがあり、テンプレートを
使用して、楽しんでおります。
この、ラッパーに触発を受け、約10日間、PDF分野のWEB 検索を続け、
サンプルソースを実行、機能確認をしておりましたが、中で、サーブレット(itextServlet.java)
による定型文書作成の例がありました。これら例では、プログラムソースに変更を加える度合いが大きく、初心者には、危ない構造になっておりました。

先生のラッパーは、安全ですが、皆様ご存知の如く、専用ツールを使用すれば、別でしょうが、
(iReport-0.4.1は今回触った程度、今後、AcobatBatproの勉強のようあり。)
プログラムから、PDF作成の場合、javaではソース変更とコンパイルが必須となり、初心者には辛いものとなります。
このため、PDF文書のテーブル要素の変更で、Excel CSVを生成し、これを、ArrayListや2次元配列に変換し、容易にPDFテーブル要素を更新する方法がないか、これも、必死にサーチしましたが
ありませんでした。約40時間
ただ、csvをArrayListにするソース(CSVRead.java))の紹介があり、これをitextのlistに変換、
(String[][] uriage_data =  (String[][]) uriage_data1.toArray(new String[0][0]);これもWEBページで検索、初心者故、何からなにまで、検索)
サーブレット側のソースを変更修正を行い、実行しましたら、Excel csvの作成したもので、
PDFテーブル要素を更新ができました。人様のサーブレットフレームとcsv ArrayListクラス
を利用しておりますので、ソース公開は、如何なものか、躊躇しております。
ただ、こうした方法も、私ども初心者には有益と思い、投稿させていただきました。
追伸。
英語itextホームページで、画像imageに対するURLリンクはannotationが有効で、
これで、セル内の画像から、拡大画像などのURLへ飛ぶことができました。
以上。


投稿:ms_naka[nakaso]/2009年 02月 02日 14時 12分 /更新:2009年 02月 02日 14時 13分
RE:iTextを使ってPDF帳票を出力するためのラッパー
by 竹形 誠司[takegata]
竹形です、こんにちは。
このラッパーはMySQLなどのデータを帳票に出力するために作ったものなのですが、CSVだとどのような使い方になるんでしょうね。
見積/請求システムのデモサイトを作ってあるので、見てみてください。

http://neo.smop.biz/erp/login/login_form.jsp
login:guest
password:guest

見積の詳細画面で印刷ボタンを押すとPDF帳票が出力されます。
投稿:竹形 誠司[takegata]/2009年 02月 02日 15時 55分 /更新:2009年 02月 02日 15時 55分
RE:iTextを使ってPDF帳票を出力するためのラッパー
by ms_naka[nakaso]
竹形先生様。
当方のExcelcsv+Servletは、先生の見積の詳細画面の印刷ボタンで、出現するPDF帳票の各項目内容だけをExcel csv で、直接、サーブレットに送り込む単体機能だけです。所謂、業務システムとしての機能はありません。しかし、
PDF側では、その都度手軽に、内容更新が出来き、印刷ができます。Webで、
色々サーチしても、このような紹介が見当たらず、出来たときには、うれしくて、報告したしだい。初心者の勇み足ですね。
以上の如く、当方の例では、システムと言う範疇にははいりませんので、先のコメント記述は、皆様に、誤解を与えかねないものです。お詫び申し上げます。
さて、先生のシステム例ですが、今更の如く、驚嘆させられました。この紹介されているサンプルは、すでに、書籍で、発刊済みなのでしょうか。ぜひ、勉強する機会をと、願っております。
また、先生のラッパーがどのように、当システムに組み込まれたのか、本当に
勉強したいと願っております。
以上


投稿:ms_naka[nakaso]/2009年 02月 02日 19時 58分 /更新:2009年 02月 02日 19時 58分
RE:iTextを使ってPDF帳票を出力するためのラッパー
by 竹形 誠司[takegata]
なるほど、CSVを送るとPDFが帰ってくるのですか。そういうニーズもあるかも知れませんね。

上でご紹介した見積・請求のシステムはまだ書籍にはなっていません。いずれ時間を作ってまとめたいと思っていますが、まだちょっとかかりそうです。
投稿:竹形 誠司[takegata]/2009年 02月 02日 22時 33分 /更新:2009年 02月 02日 22時 33分
RE:iTextを使ってPDF帳票を出力するためのラッパー
by ms_naka[nakaso]
竹形先生様
当方の前の文章表現がいい加減だったようです。CSVを送るとPDFが帰ってくる意味と解釈できますね。すみませんでした。
色んな方法もあると思いますが、例えば、Web の、excel シートで、CSVを作成させ、cgi経由のリモートマクロ起動で、サーバー側で、同じシートを作成。サーブレトで、更新したPDF表示するといったものではありません。
**当方のものは、単に、サーバー側PC下のExcel csv をバッチ更新すると
サーブレットで、更新が反映されたPDFを閲覧印刷できるだけのことです。
何度も誤解を招くような表現で申し訳ございませんでした。**
お詫びいたします。


以上、
投稿:ms_naka[nakaso]/2009年 02月 03日 00時 17分 /更新:2009年 02月 03日 00時 18分
RE:iTextを使ってPDF帳票を出力するためのラッパー
by 竹形 誠司[takegata]
新しいバージョンのiTextに合わせて帳票作成用のプログラムを修正しました。
こちらを御覧ください。

http://www.orquesta.org/takegata/Article/ArticleView.jsp?article_id=796#A796
投稿:竹形 誠司[takegata]/2011年 04月 19日 08時 23分 /更新:2011年 04月 19日 08時 23分