ウェブ上に業務アプリケーションを構築する際にやっかいなのが帳票の出力ですね。オープンソースの帳票エディタなどもあるようですが、なかなか手軽に使えるものがありません。そこでXMLで帳票のテンプレートを書いて、プログラムから値を挿入できるようなプログラムを3年ほど前に書きました。その時に利用していたiTextというPDF生成用のライブラリがバージョンアップした影響で、当時のソースがコンパイルできなくなっていたのですが、修正しながらソースを整理したので再度公開します。以下はreadme.txtから。
本プログラムは、XML形式で帳票を定義し、プログラムよりデータを挿入し、PDF形式の出力を得るための補助ライブラリです。PDFデータ生成には、オープンソースのPDF生成ライブラリであるiText(R)を使用します。iTextについては http://www.itextpdf.com を御覧ください。iTextをGPLで使用しているので、本プログラムもGPLです。
使用できる要素は<table>、<tr>、<td>の3種類です。HTMLの<TABLE>、<TR>、<TD>と同様の方法でテーブルを定義します。<table>要素のcols属性は、テーブルの列数を指定するもので、必ず指定する必要があります。プログラムでセルに値を埋め込む場合は、<td>要素に<id>属性を指定しておきます。
例:

table
STEP1 - PdfTableBuilderオブジェクトの生成
STEP2 - テンプレートをPdfTableBuilderにセット
org.w3c.domライブラリを使用してElementオブジェクトを取得し、
setTemplateメソッドでPdfTableBuilderにセットします。
STEP3 - 入力データをPdfTableBuilderにセット
HashMap<String,String>型のオブジェクトにキーと値を登録して
setDatamメソッドでPdfTableBuilderにセットします。
キーはテンプレートで設定した<td>要素のid属性、
値はそのセルに表示する文字列です。
STEP4 - PDFデータの出力先をPdfTableBuilderにセット
PDFファイルを出力するOutputStreamオブジェクトを作成して
setOutputStreamメソッドでPdfTableBuilderにセットします。
STEP5 - PdfTableBuilderのprocess()メソッドを実行
例:
長さや幅を指定する場合の単位はmmまたはpt(1/72インチ)を使います。
色を指定する場合は、"white","black","gray","red","green","blue","yellow"の文字列指定と"#80FF80"などの数値指定が可能です。
<document>
テーブルを配置する帳票を表す要素です。
属性:
size 帳票のサイズを指定します。例:"A4P","A4L","洋0","200mm 150mm"
margin 帳票の余白を左右上下の順に指定します。例:"10mm 10mm 15mm 20mm"
<table>
帳票にテーブルを配置します。1つの帳票に複数のテーブルを配置できます。
属性:
cols テーブルに含まれる列の数(必須)を指定します。 例:"3"
outer-border-width テーブルの外枠の太さを指定します。例:"1pt"
inner-border-width テーブルの内枠の太さを指定します。例:"0.5pt"
margin-top テーブル上部のマージを指定します。例:"5mm"
margin-bottom テーブル下部のマージを指定します。例:"5mm"
widths 各列の幅を整数の相対値で指定します。例:"5 2 2"
※td要素の属性をtable要素で指定すると、そのテーブルでのデフォルトになります。
<tr>
テーブルに行を追加します。
この要素に専用の属性はありません。
※td要素の属性をtr要素で指定すると、その行でのデフォルトになります。
<td>
テーブルにセルを追加します。
属性:
id テータを挿入する際のキー名を指定します。例:"field1"
colspan セルを横方向に結合します。例:"2"
rowspan セルを縦方向に月号します。例:"3"
min-height 最小の高さを指定します。例:"5mm"
height 固定の高さを指定します。例:"5mm"
align-h 水平方向の配置方法を指定します。例:"center","left","right"
align-v 垂直方向の配置方法を指定します。例:"middle","bottom","top"
font-family フォントを指定します(明朝orゴシックのみ)。例:"明朝","ゴシック"
font-style フォントのスタイルを指定します。例:"normal","bold","italic","oblique","underline","line-through"
font-size 文字のサイズを指定します。例:"12pt"
font-color 文字の色を指定します。例:"#5580A0"
background-color 背景色を指定します。例:"red"
border-width 枠線の太さを指定します。例:"1pt"
border-width-top 枠線(上)の太さを指定します。例:"1pt"
border-width-bottom 枠線(下)の太さを指定します。例:"1pt"
border-width-left 枠線(左)の太さを指定します。例:"1pt"
border-width-right 枠線(右)の太さを指定します。例:"1pt"
border-color 枠線の色を指定します 例:"gray"
border-color-top 枠線(上)の色を指定します 例:"gray"
border-color-bottom 枠線(上)の色を指定します 例:"gray"
border-color-left 枠線(左)の色を指定します 例:"gray"
border-color-right 枠線(右)の色を指定します 例:"gray"
padding セルの境界と文字の間の余白の幅を指定します。例:"1mm"
padding-top セルの境界(上)と文字の間の余白の幅を指定します。例:"1mm"
padding-bottom セルの境界(下)と文字の間の余白の幅を指定します。例:"1mm"
padding-left セルの境界(左)と文字の間の余白の幅を指定します。例:"1mm"
padding-right セルの境界(右)と文字の間の余白の幅を指定します。例:"1mm"
rotation 文字の向きを指定します。例:"left","right","up","down"
line-height 行間隔をフォントサイズの相対値で指定します。例:"1.5"
character-spacing 文字間隔を指定します。例:"2mm"
●追記
機能を追加したバージョンをアップしました。Webアプリケーションで使うためのJSPのサンプルもあります。
http://www.orquesta.org/takegata/Article/ArticleView.jsp?article_id=825
PDF Table Builder (PDF帳票ビルダー)使い方
本プログラムは、XML形式で帳票を定義し、プログラムよりデータを挿入し、PDF形式の出力を得るための補助ライブラリです。PDFデータ生成には、オープンソースのPDF生成ライブラリであるiText(R)を使用します。iTextについては http://www.itextpdf.com を御覧ください。iTextをGPLで使用しているので、本プログラムもGPLです。
テンプレートの作成
帳票のテンプレートをXMLデータとして作ります。使用できる要素は<table>、<tr>、<td>の3種類です。HTMLの<TABLE>、<TR>、<TD>と同様の方法でテーブルを定義します。<table>要素のcols属性は、テーブルの列数を指定するもので、必ず指定する必要があります。プログラムでセルに値を埋め込む場合は、<td>要素に<id>属性を指定しておきます。
例:
<table cols="3">
<tr>
<td>AAA</td>
<td>BBB</td>
<td>CCC</td>
</tr>
<tr>
<td rowspan="2">DDD</td>
<td colspan="2">EEE</td>
</tr>
<tr>
<td>FFF</td>
<td>GGG</td>
</tr>
<tr>
<td id="last-cell" colspan="3"></td>
</tr>
</table>
<tr>
<td>AAA</td>
<td>BBB</td>
<td>CCC</td>
</tr>
<tr>
<td rowspan="2">DDD</td>
<td colspan="2">EEE</td>
</tr>
<tr>
<td>FFF</td>
<td>GGG</td>
</tr>
<tr>
<td id="last-cell" colspan="3"></td>
</tr>
</table>

table
Javaプログラムの作成
Javaプログラムで以下の処理を行います。STEP1 - PdfTableBuilderオブジェクトの生成
STEP2 - テンプレートをPdfTableBuilderにセット
org.w3c.domライブラリを使用してElementオブジェクトを取得し、
setTemplateメソッドでPdfTableBuilderにセットします。
STEP3 - 入力データをPdfTableBuilderにセット
HashMap<String,String>型のオブジェクトにキーと値を登録して
setDatamメソッドでPdfTableBuilderにセットします。
キーはテンプレートで設定した<td>要素のid属性、
値はそのセルに表示する文字列です。
STEP4 - PDFデータの出力先をPdfTableBuilderにセット
PDFファイルを出力するOutputStreamオブジェクトを作成して
setOutputStreamメソッドでPdfTableBuilderにセットします。
STEP5 - PdfTableBuilderのprocess()メソッドを実行
例:
//--- STEP 1 ---
PdfTableBuilder tableBuilder = new PdfTableBuilder();
//--- STEP 2 ---
File template = new File("Sample1.xml");
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
org.w3c.dom.Document xmlDocument = builder.parse(template);
org.w3c.dom.Element xmlElement = xmlDocument.getDocumentElement();
tableBuilder.setTemplate(xmlElement);
//--- STEP 3 ---
HashMap<String,String> hmValues = new HashMap<String,String>();
hmValues.put("last-cell","テスト");
tableBuilder.setData(hmValues);
//--- STEP 4 ---
String filename = "Sample1.pdf";
tableBuilder.setOutputStream(new FileOutputStream(filename));
//--- STEP 5 ---
tableBuilder.process();
PdfTableBuilder tableBuilder = new PdfTableBuilder();
//--- STEP 2 ---
File template = new File("Sample1.xml");
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
org.w3c.dom.Document xmlDocument = builder.parse(template);
org.w3c.dom.Element xmlElement = xmlDocument.getDocumentElement();
tableBuilder.setTemplate(xmlElement);
//--- STEP 3 ---
HashMap<String,String> hmValues = new HashMap<String,String>();
hmValues.put("last-cell","テスト");
tableBuilder.setData(hmValues);
//--- STEP 4 ---
String filename = "Sample1.pdf";
tableBuilder.setOutputStream(new FileOutputStream(filename));
//--- STEP 5 ---
tableBuilder.process();
テンプレートで使用する要素と属性
XMLで作成する帳票テンプレートでは次のような要素と属性を使用します。長さや幅を指定する場合の単位はmmまたはpt(1/72インチ)を使います。
色を指定する場合は、"white","black","gray","red","green","blue","yellow"の文字列指定と"#80FF80"などの数値指定が可能です。
<document>
テーブルを配置する帳票を表す要素です。
属性:
size 帳票のサイズを指定します。例:"A4P","A4L","洋0","200mm 150mm"
margin 帳票の余白を左右上下の順に指定します。例:"10mm 10mm 15mm 20mm"
<table>
帳票にテーブルを配置します。1つの帳票に複数のテーブルを配置できます。
属性:
cols テーブルに含まれる列の数(必須)を指定します。 例:"3"
outer-border-width テーブルの外枠の太さを指定します。例:"1pt"
inner-border-width テーブルの内枠の太さを指定します。例:"0.5pt"
margin-top テーブル上部のマージを指定します。例:"5mm"
margin-bottom テーブル下部のマージを指定します。例:"5mm"
widths 各列の幅を整数の相対値で指定します。例:"5 2 2"
※td要素の属性をtable要素で指定すると、そのテーブルでのデフォルトになります。
<tr>
テーブルに行を追加します。
この要素に専用の属性はありません。
※td要素の属性をtr要素で指定すると、その行でのデフォルトになります。
<td>
テーブルにセルを追加します。
属性:
id テータを挿入する際のキー名を指定します。例:"field1"
colspan セルを横方向に結合します。例:"2"
rowspan セルを縦方向に月号します。例:"3"
min-height 最小の高さを指定します。例:"5mm"
height 固定の高さを指定します。例:"5mm"
align-h 水平方向の配置方法を指定します。例:"center","left","right"
align-v 垂直方向の配置方法を指定します。例:"middle","bottom","top"
font-family フォントを指定します(明朝orゴシックのみ)。例:"明朝","ゴシック"
font-style フォントのスタイルを指定します。例:"normal","bold","italic","oblique","underline","line-through"
font-size 文字のサイズを指定します。例:"12pt"
font-color 文字の色を指定します。例:"#5580A0"
background-color 背景色を指定します。例:"red"
border-width 枠線の太さを指定します。例:"1pt"
border-width-top 枠線(上)の太さを指定します。例:"1pt"
border-width-bottom 枠線(下)の太さを指定します。例:"1pt"
border-width-left 枠線(左)の太さを指定します。例:"1pt"
border-width-right 枠線(右)の太さを指定します。例:"1pt"
border-color 枠線の色を指定します 例:"gray"
border-color-top 枠線(上)の色を指定します 例:"gray"
border-color-bottom 枠線(上)の色を指定します 例:"gray"
border-color-left 枠線(左)の色を指定します 例:"gray"
border-color-right 枠線(右)の色を指定します 例:"gray"
padding セルの境界と文字の間の余白の幅を指定します。例:"1mm"
padding-top セルの境界(上)と文字の間の余白の幅を指定します。例:"1mm"
padding-bottom セルの境界(下)と文字の間の余白の幅を指定します。例:"1mm"
padding-left セルの境界(左)と文字の間の余白の幅を指定します。例:"1mm"
padding-right セルの境界(右)と文字の間の余白の幅を指定します。例:"1mm"
rotation 文字の向きを指定します。例:"left","right","up","down"
line-height 行間隔をフォントサイズの相対値で指定します。例:"1.5"
character-spacing 文字間隔を指定します。例:"2mm"
●追記
機能を追加したバージョンをアップしました。Webアプリケーションで使うためのJSPのサンプルもあります。
http://www.orquesta.org/takegata/Article/ArticleView.jsp?article_id=825
投稿:竹形 誠司[takegata]/2011年 04月 19日 08時 09分
/更新:2011年 05月 20日 12時 13分
RE:PDFの帳票をXML形式のテンプレートから生成
by ms_naka[nakaso]
先生からXMLでのテーブルTAGの使用で、以前より一層自由度が高く、初心者
にも、フォーマットが容易に作成出来るPdfTableBuilder&関連jarを公開して頂きましたので、
早速、ダウンロードさせて頂き、トライしました。
唯、当方のJDKは、当時の1.5.0_06のままで、で、lib に関連jar(iTextAsianCmaps.jar、iTextAsian.jar、ほか、
itextのjar がitext-1.4.5.jar、iText-2.1.4.jar)が残留しております。
itext-1.4.5.jarとiText-2.1.4.jarは、バージョン名がありますので、同じフォルダーにいれても問題はないとおもいますが、
そのほかのjarファイル、iTextAsianCmaps.jar、iTextAsian.jarは、3年前と同一名となっております。
今回のjarファイルの上書きで、当時のサンプルプログラムが動作不全とならないのか、心配しですので、
このため、先生からのダウンロードファイルpdftableをC:\jdk1.5.0_06\bin\pdftableに配置し、クラスパスは
絶対パスに以下の如く修正しなおしコンパイル、しました。
―ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーC:\jdk1.5.0_06\bin\pdftable\sample>javac -d . -cp C:/jdk1.5.0_06/bin/pdftable/sample/pdftable.jar
PdfTableTest1.java
―ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー結果、以下のエラーが発生。
PdfTableTest1.java:14: jp.veltec.pdftable.PdfTableBuilder にアクセスできません。
クラスファイル C:\jdk1.5.0_06\bin\pdftable\sample\pdftable.jar(jp/veltec/pdftabl
e/PdfTableBuilder.class) は不正です。
クラスファイルのバージョン 50.0 は不正です。49.0 であるべきです。
削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください。
PdfTableBuilder tableBuilder = new PdfTableBuilder();
^
エラー 1 個 以上となりました。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
当方のリソースの配置とクラスパス指定ミスと思われますが、トレースできません。
以前は、問題なく、コンパイル実行できましたが、失念してしまいました。、
お手数でしょうが、ご教授お願い申し上げます。
にも、フォーマットが容易に作成出来るPdfTableBuilder&関連jarを公開して頂きましたので、
早速、ダウンロードさせて頂き、トライしました。
唯、当方のJDKは、当時の1.5.0_06のままで、で、lib に関連jar(iTextAsianCmaps.jar、iTextAsian.jar、ほか、
itextのjar がitext-1.4.5.jar、iText-2.1.4.jar)が残留しております。
itext-1.4.5.jarとiText-2.1.4.jarは、バージョン名がありますので、同じフォルダーにいれても問題はないとおもいますが、
そのほかのjarファイル、iTextAsianCmaps.jar、iTextAsian.jarは、3年前と同一名となっております。
今回のjarファイルの上書きで、当時のサンプルプログラムが動作不全とならないのか、心配しですので、
このため、先生からのダウンロードファイルpdftableをC:\jdk1.5.0_06\bin\pdftableに配置し、クラスパスは
絶対パスに以下の如く修正しなおしコンパイル、しました。
―ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーC:\jdk1.5.0_06\bin\pdftable\sample>javac -d . -cp C:/jdk1.5.0_06/bin/pdftable/sample/pdftable.jar
PdfTableTest1.java
―ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー結果、以下のエラーが発生。
PdfTableTest1.java:14: jp.veltec.pdftable.PdfTableBuilder にアクセスできません。
クラスファイル C:\jdk1.5.0_06\bin\pdftable\sample\pdftable.jar(jp/veltec/pdftabl
e/PdfTableBuilder.class) は不正です。
クラスファイルのバージョン 50.0 は不正です。49.0 であるべきです。
削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください。
PdfTableBuilder tableBuilder = new PdfTableBuilder();
^
エラー 1 個 以上となりました。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
当方のリソースの配置とクラスパス指定ミスと思われますが、トレースできません。
以前は、問題なく、コンパイル実行できましたが、失念してしまいました。、
お手数でしょうが、ご教授お願い申し上げます。
投稿:ms_naka[nakaso]/2011年 04月 26日 20時 18分
/更新:2011年 04月 26日 20時 18分
竹形です。ご報告ありがとうございます。
現象について調べたところ、上にアップロードしたjarファイルではJ2SE5.xの環境ではコンパイルできないことが分かりました。J2SE5.0の環境でjarファイルを作り直しましたので、こちらをお使いください。
現象について調べたところ、上にアップロードしたjarファイルではJ2SE5.xの環境ではコンパイルできないことが分かりました。J2SE5.0の環境でjarファイルを作り直しましたので、こちらをお使いください。
投稿:竹形 誠司[takegata]/2011年 04月 26日 22時 16分
/更新:2011年 04月 26日 22時 19分
先生には、夜分にも拘らず、ご返事を頂き、有難うございます。
早速ダウンロードさせて頂き、確認しました所、
エラーもなく、実行されました。
御指摘の通りでありました。有難うございます。
この、PDFの帳票をXML形式のテンプレートから生成するプログラムで、当方の
レイアウトの帳票をXMLに反映し、試作してみました。
<table cols="4">で、<td>を増加しましたが、本当に、簡単にPDF帳票に反映されました。
これは、初心者にも分かりやすく、すごいものを紹介してもらったと、
感謝しております。
細かい、帳票制御もXML自体で、設定可能でありますので、トライいたします。
尚、今回のエラーの直接原因は、当方のJDK1.5と環境が、古く、ご迷惑をお掛けしましたが,以前、作成したJava サンプルAPPがサーバー上にあり、
まだ、有効にさせている為,バージョンアップによるトラブルが怖くて、
アップ出来ないのが、現状です。
従って、Apacheサーバーも2.055,Tomcatも5止まりで、アップバージョンしておりません。
アップバージョンには、当方の様なレベルでは、相当な体力を要するものと思われ、既に、73歳になる当方には、時間も、体力もなく、このままの推移を余儀なしと考えるようになりました。。
この為、時折、今回のような事態もあり、申し訳なくお詫び申し上げます。
最後に、先生の方で、上記年齢部分は、削除して頂いても、結構です。
早速ダウンロードさせて頂き、確認しました所、
エラーもなく、実行されました。
御指摘の通りでありました。有難うございます。
この、PDFの帳票をXML形式のテンプレートから生成するプログラムで、当方の
レイアウトの帳票をXMLに反映し、試作してみました。
<table cols="4">で、<td>を増加しましたが、本当に、簡単にPDF帳票に反映されました。
これは、初心者にも分かりやすく、すごいものを紹介してもらったと、
感謝しております。
細かい、帳票制御もXML自体で、設定可能でありますので、トライいたします。
尚、今回のエラーの直接原因は、当方のJDK1.5と環境が、古く、ご迷惑をお掛けしましたが,以前、作成したJava サンプルAPPがサーバー上にあり、
まだ、有効にさせている為,バージョンアップによるトラブルが怖くて、
アップ出来ないのが、現状です。
従って、Apacheサーバーも2.055,Tomcatも5止まりで、アップバージョンしておりません。
アップバージョンには、当方の様なレベルでは、相当な体力を要するものと思われ、既に、73歳になる当方には、時間も、体力もなく、このままの推移を余儀なしと考えるようになりました。。
この為、時折、今回のような事態もあり、申し訳なくお詫び申し上げます。
最後に、先生の方で、上記年齢部分は、削除して頂いても、結構です。
投稿:ms_naka[nakaso]/2011年 04月 27日 10時 59分
/更新:2011年 04月 27日 11時 00分