1.Apache FOPの紹介
Apache FOPは、オープンソースのXSL-FOプロセッサである。XSL-FOオブジェクトからPDFを作成したり、FAX送信に必要なTIFF(CCITT T.4, CCITT T.6)ファイルなど、いろいろなフォーマットのファイルを作成することができます。日本語を使用するには、フォントメトリックファイルを作成する必要がありましたが、バージョン0.95からは、設定ファイルfop.xconfの<fonts>タグに、<auto-detect/>タグを追加するだけで、日本語が使用できます。詳細は、Basic font configurationに掲載されています。また使用できるフォントは、Type 1 FontとTrueType Fontです。Apach FOPの使用方法を掲載している、日本語のサイトの大部分では、日本語を使用する場合、フォントメトリックファイルを必ず作成しなければならないような記述がありますが、それは古いバージョンではそうでしたが、今は、バージョン0.95、1.0では必要ありません。たまたま見た日本語のサイトで、自動設定が可能であることを発見しました。これで日本語導入の煩わしい作業が減りました。公式の英語サイトを、詳細に読む手間を惜しまない事の大切さを身に染みて感じました。詳細に読んだおかげで、fop1.1rc1では、128bitの暗号が可能となったことを知りました。今までは、40bitの暗号でしたが、128bit に変更するこができます。正式バージョンの1.1のリリースが楽しみです。(2012年10月20日に正式バージョンの1.1がリリースしました。) PDFの暗号の設定は、Apache FOP 1.1の新機能(2012/11/16から掲載)にて掲載しています。
Apach FOPは、SVGを使用することができます。単純な帳票ならXSL-FOのみで、複雑ならSVGを使用することができます。SVGの機能に、テキストや図形作成などのいろいろな機能がありますので、それを応用して帳票を作成することができます。SVGとの連携は、Apache FOPとSVGの連携のブログ記事にて掲載しています。またBarcode4jを使用したバーコード付きPDFについては、バーコード付きPDFの作成のブログ記事にて掲載しています。そしてApache FOPとBarcode4jの連携方法は、Using the barcode extension for Apache FOPにあります。それからTIFF出力にいて、Apache FOPのTIFF出力の方法のブログ記事にて掲載しています。最後に、Apache FOP、Barcode4j および ZXing を使用したQRコード付きPDFについては、Apache FOP、Barcode4j および ZXing を使用して、QRコード付きPDFファイルを生成する方法(日本語可能)のブログ記事にて掲載しています。
2.実際のシステム作りでの帳票作成の流れ
XSL-FOまたは、XSL-FOとSVGで一度、様式ファイルを作成します。その後、動的に変わる部分を、XSLTプロセッサを利用して動的に変わるようにXSLTで書き直します。最終的に、フォーム層は、XSLT形式で記述し、データ層は、XML形式で記述します。フォーム層とデータ層から、XSLTプロセッサでXSL-FOオブジェクトを生成し、Apache FOPで帳票を作成します。
3.XSLT + Apach FOP + SVG + テキストエディタ による帳票作成のメリットとデメリット。
●メリット
- 商用の大部分の帳票作成ツールは、メーカ独自のフォーマットを使用するが、標準技術のXSLT、XSL-FOとSVGで、GUIツールなしにテキストエディタで、実際に役立つ帳票を作成できる。
- 帳票のGUIツールは便利だが、XSLT、Apach FOPとSVGなら、テキストファイルを直に修正して、0.1mm単位の微調整ができる。
- SVGだけで帳票の様式ファイルをデザインすれば、ウェブブラウザで、すぐにデザインを確認できる。
- 帳票様式は、フォーム層とデータ層に分離でき、イラストレータなど、市販のSVG画像編集ソフトを使用してフォーム層の基礎部分を作成できる。(SVGの部分だけ、デザイナーに外注できる。)
- XSL-FOは、一つの帳票を複数の区画に分割できるので、一つの帳票を、同時に複数人で作成・修正でき、後で統合することが可能である。
- XML形式なので、プログラムソースのようにコメントを追加できる。
- XSL-FO形式で、ネイティブXMLデータベースで保存すれば、帳票内容のデータ分析を行うことができ、また再度、帳票を作成するときにデータを一から作成する必要がない。
- 無料である。デザインをするクライアント及び、帳票の作成を実行するサーバのライセンス料がかからない。メーカによるが、ライセンス料が、開発、評価及び本番環境を含めると、約数十万~数百万円くらいで、高機能すぎるがゆえにとても高価である。(気のせいか、昔に比べて、全体的に値段が高くなっているような気がする。オープンソースのツールの利用が増えて売り上げが落ちているのだろうか。)
- いろいろなファイル形式(PDF, PS, PCL, AFP, XML, Print, TIFF, AWT and PNG)に対応している。メーカ製なら、オプション扱いで別当料金が発生する場合がある。
- 負け惜しみであるが、帳票のGUIツールは頭をあまり使わなく便利である。しかし標準技術を使うことで、自由度は極めて高く、また頭を使って苦労するのでいいアイディアも生まれやすい。また帳票作成で使用したXMLに関する標準技術は、他の分野にも必ず役立つ。
●デメリット
- XSLT、XSL-FO及びSVGの仕様を覚える必要がある。
- 帳票のGUIツールに比べ、帳票作成の生産性が低い。会社で帳票のテンプレートをストックすることで、ある程度は解消できる。
- メーカ独自の便利な機能は、自前で実現しないといけない。(たいていの帳票作成ツールを提供するメーカには、メーカ独自の便利な機能がある。たとえば、ソート機能、合計機能、ある項目が変わったときの改ページ等。)
4.定型様式及び非定型様式の帳票
様式が非定型ならXLS-FO、様式が定型なら、XLS-FOかSVGが原則になると思います。
XLS-FOは、たとえば、文字が一行にはいりきれなかったら自動的に改行をし、またページがいっぱいになったら改ページをしてくれます。またページ番号、総ページ数を表示することも可能です。しかし、既存の大部分の帳票作成ソフトは、表示する項目の文字数が決まっていてあふれた文字を、特別な設定をしない限り、改行、改ページをすることはありません。私が、帳票を設計するのなら、XLS-FOのみの機能で実現できるのならXLS-FOで、そうでなければSVGも使用して帳票を作成します。
5.実際の帳票作成例
コンビニ請求書の例は、休みの空いた時間に、Apache FOP、Barcode4jとSVGでどこまでできるのか試しに作成したものである。
※注意
1.サンプルであって、実際に使用する場合、印刷品質とバーコードの読取精度の確認等が必要である。
2.バーコードの内容を確認する目視文字は、改行文字を出力できないため、Barcode4jのソースファイルを修正しています。修正箇所は2ファイルで、下記、「9.付録 Barcode4jの修正例」にて説明しています。
3.Apache FOPは、日本語の縦書きに対応していませんが、SVGは対応しています。
図 1. コンビニ請求書(クリックするとPDFを表示します。)
(Adobe Readerの100%表示で一部太線のレイアウトが崩れていますが、125%で表示すれば、きちんと太線が描かれているのが確認できます。)
6.SVGのアニメ
SVGを使用することで、無制限にどんなものも作成できてしまうと思わせるアニメがありました。
SVG女子は、マイクロソフト基調講演MIX11で公開され、世界中から注目を浴びましたが、日本でも公開されました。
詳細は、右記サイトです。 http://jsdo.it/event/svggirl/
7.最後に
SVGには、テキストや図形作成などのいろいろな機能があるので、それらを駆使することで、サンプル例のように、実際に役立ちそうな帳票を作成することもできます。
自分がSEになったときに比べて、XMLの技術がより浸透し、実際のシステム作りに役立ってきているという実感があります。最新のEclipseは、XMLスキーマファイルを読み込んで、XML文書のコード補完が当たり前のようにできています。つい10年前なら、数万円出してXMLエディタを買わないといけなかったのに便利になったものである。Apache FOPのコード補完の設定もEclipseで使用できます。またそれを応用してSVGのコード補完の設定もできます。詳細は、Apache FOPのEclipseコード補完設定(コンテンツアシスト)とSVGのEclipseコード補完設定(コンテンツアシスト)を参照して下さい。
8.参照
公共料金等代理収納GS1-128(旧:UCC/EAN-128)システム
オフィスプリンターの「コンビニバーコード出力」対応
9.付録 Barcode4jの修正例
11行目をコメントアウトして、13~16行目にて、目視文字の出力フォーマットに改行文字が含まれていた場合の処理を追加しています。修正の仕方は、改行文字が含まれていない場合は、既存の処理と同じようになるようにしています。
図 2. org.krysalis.barcode4j.impl.AbstractBarcodeBean getHumanReadableHeight()
public double getHumanReadableHeight() { if (getMsgPosition() != HumanReadablePlacement.HRP_NONE) { double textHeight = this.fontSize; if (hasFontDescender()) { //return 1.3 * textHeight; textHeight *= 1.3; //1.3 is the factor for the font descender //(just an approximation due to the lack of a font engine) } else { //return textHeight; } if(getPattern()!=null && getPattern().indexOf("\n")>0) { textHeight *= 2.0; } return textHeight; } else { return 0.0; } }
6行目をコメントアウトして、8~17行目にて、目視文字の出力フォーマットに改行文字が含まれていた場合の処理と、そうでない場合の処理を追加しています。修正の仕方は、改行文字が含まれていない場合は、既存の処理と同じようになるようにしています。
図 3. org.krysalis.barcode4j.impl.DefaultCanvasLogicHandler endBarcode()
public void endBarcode() { if (bcBean.getMsgPosition() == HumanReadablePlacement.HRP_NONE) { //nop } else { double ty = getTextBaselinePosition(); //DrawingUtil.drawText(canvas, bcBean, formattedMsg, getStartX(), x, ty, TextAlignment.TA_CENTER); if(formattedMsg!=null & formattedMsg.indexOf("\n")>0) { String msgBeforeNewline = formattedMsg.substring(0, formattedMsg.indexOf("\n")); String msgAfterNewline = formattedMsg.substring(formattedMsg.indexOf("\n")+1); DrawingUtil.drawText(canvas, bcBean, msgBeforeNewline, getStartX(), x, ty - bcBean.getFontSize()-bcBean.getHumanReadableHeight() / 100, TextAlignment.TA_LEFT); DrawingUtil.drawText(canvas, bcBean, msgAfterNewline, getStartX(), x, ty,TextAlignment.TA_LEFT); } else { DrawingUtil.drawText(canvas, bcBean, formattedMsg, getStartX(), x, ty, TextAlignment.TA_CENTER); } } }
©中條勝徳 and okulejp.com, 2012.
ピンバック: 7月23日の注目記事 | Javable.Jp