1.はじめに
今日は、Apache FOPの機能を利用した、TIFF出力について説明したいと思います。システム開発において、FAX送信機能を実現するにあたり、TIFFイメージが必要なときがあると思います。Apache FOPを利用することで、同じXSL-FO文書を流用して、PDFだけでなく、TIFFも出力できます。
2.環境設定
- Javaライブラリのインストール
TIFFの圧縮方式のCCITT T.4 (Fax Group 3)及び、CCITT T.6 (Fax Group 4)には、 Java Advanced Imaging Image I/O Toolsが必要です。下記からダウンロードできます。Apache FOPの公式サイトのJava Advanced Imaging Image I/O Toolsへのリンク先が古いので、見つけるのに苦労しました。
(jai_imageio-1_0_01-lib-windows-i586-jdk.exeを実行すれば、「jdkインストールフォルダ\jre\lib\ext」にjai_imageio.jarがインストールされます。jai_imageio-1_0_01-lib-windows-i586-jre.exeを実行すれば、「jreのインストールフォルダ\lib\ext」にjai_imageio.jarがインストールされます。)
Java Advanced Imaging Image I/O Toolsのダウンロードサイトへ
- 圧縮方式は、<compression>タグの内容で指定します。詳細は、TIFF-specific Configurationに掲載されています。またfop.xconfファイルは、Apache FOPの公式サイト Archive Downloadのbinariesまたは、sourceに含まれています。
図 1. fop.xconfの修正部分(下記の例は、CCITT T.6です。)
<renderer mime="image/tiff">
<transparent-page-background>true</transparent-page-background>
<compression>CCITT T.6</compression>
</renderer>
- PDFの日本語フォント設定は、<fonts>タグに、<auto-detect/>タグを追加するだけで、日本語フォントが使用できます。使用できるフォントは、Type 1 FontとTrueType Fontです。詳細は、Basic font configurationに掲載されています。
図 2. fop.xconfの修正部分
<renderer mime="application/pdf">
<filterList>
<value>flate</value>
</filterList>
<fonts>
<auto-detect/>
</fonts>
</renderer>
3.JavaプログラムにおけるTIFF出力
ExampleFO2PDF.javaの修正例 (ExampleFO2PDF.javaは、Apache FOPの公式サイト Archive Downloadのbinariesまたは、sourceに含まれています。)
- 67行目の「FOUserAgent foUserAgent = fopFactory.newFOUserAgent();」の後に、「fopFactory.setUserConfig(new File(“fop.xconf”));」を追加します。
- 77行目の「Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);」のMIME_PDFをMIME_TIFFに修正します。
- 128行目の「File fofile = new File(baseDir, “xml/fo/helloworld.fo”);」のファイル名を修正します。
- 130行目の「File pdffile = new File(outDir, “ResultFO2PDF.pdf”);」のファイル名を修正します。
4.使用したXSL-FO文書
http://www7b.biglobe.ne.jp/~okule/okule/wordpress/FAX/fax.foからダウンロードできます。
5.実際の出力結果 (Chrome バージョン 23.0.1271.97 mで画像が、正しく表示されません。原因を調査中。)
図 3. TIFF出力 圧縮形式はCCITT T.6 (クリックするとTIFFをダウンロードまたは表示します。またマルチTIFFファイルなので、Windows フォトビューアーでご覧下さい。ペイントでは1ページ目しか表示できません。)


図 4. PDF出力(クリックするとPDFを表示します。)


6.fax.foのXSL-FO文書の解説
- 出力結果の項番18のセルは、fo:table-cell要素に、keep-together.within-column=”always”を指定しないと、複数ページに分割されます。
- ヘッダーは、項番、商品名、数量、単価、金額です。フッターは、合計、消費税、合計(税込)です。fo:table要素に、table-omit-footer-at-break=”true”を指定すると、フッターは繰り返されません。
- フッターには、fo:table-cell要素に、列の結合数を示す、number-columns-spanned属性と、行の結合数を示す、number-rows-spanned属性を使用しています。備考という文字は、結合されたセルに表示されています。
- 16行目の<fo:page-number-citation ref-id=”last-page” />は、id属性がlast-pageのものを参照していて、id属性がlast-pageである要素の実際のページ数を示しております。この例の場合は、466行目のfo:table-cell要素が出力されるページ数を示しております。このようにして、全体のページ数を取得するとができます。
7.総評
自動組版ソフトの便利さを感じるところは、セルの高さをセルの内容に応じて調節してくれることです。これは、固定様式の帳票では、実現がかなり難しいと思います。今日は、実際にApache FOPを使用するにあたって役立ちそうなXSL-FOの使用テクニックをいくつか紹介しました。ここで紹介したテクニックは、XSL-FOのほんの一部分でしかありません。まだまだ、いろいろなてテクニックがあります。みなさんも一緒に学んでいきましょう。
©中條勝徳 and okulejp.com, 2012.
Apache FOPの日本語禁則処理について、最新の記事がないので検証してみました。
1.検証対象のPDFとXSL-FO文書
PDF http://okule.files.wordpress.com/2012/07/japanesehyphenation5.pdfからダウンロードできます。
XSL-FO文書 http://www7b.biglobe.ne.jp/~okule/okule/wordpress/download/JapaneseHyphenation5.foからダウンロードできます。
2.行頭禁則処理
結果は、予想通りであった。
3.行末禁則処理
左シングル引用符、左ダブル引用符及び、始め二重山括弧引用記号は、行頭禁則処理もされている。
4.分割禁止処理
連続する全角ダッシュ[—] (EM DASH)、三点リーダ[…] 及び、二点リーダ[‥] は、行頭禁則処理もされている。
5.総評
初期の頃のApache FOPは、日本語禁則処理がなされていなかったが、バージョン1.0では、上記の検証とおり、禁則処理がされていることを確認しました。日本語の禁則処理を実装してくれた人々に感謝いたします。
6.参照
3.1.7 行頭禁則 http://www.w3.org/TR/2012/NOTE-jlreq-20120403/ja/#characters_not_starting_a_line
3.1.8 行末禁則 http://www.w3.org/TR/2012/NOTE-jlreq-20120403/ja/#characters_not_ending_a_line
3.1.10 分割禁止 http://www.w3.org/TR/2012/NOTE-jlreq-20120403/ja/#unbreakable_character_sequences
©中條勝徳 and okulejp.com, 2012.
1.Barcode4Jの紹介
Barcode4Jは、Javaで実装されたオープンソースのバーコード生成ソフトです。 次の様式のバーコードが出力できます。Interleaved 2 of 5、ITF-14、Code 39、Code 128、Codabar、UPC-A、UPC-E、EAN-13、EAN-8、POSTNET、Royal Mail Customer Barcode、USPS Intelligent Mail、PDF417、DataMatrix、DataMatrix、QR Code。またSVG、EPS、PNG、JPEGなどの画像データに出力できます。Apache FOPの可能性と日本語設定のブログ記事にて、コンビニ請求書の例があります。またApache FOP、Barcode4j および ZXing を使用したQRコード付きPDFについては、Apache FOP、Barcode4j および ZXing を使用して、QRコード付きPDFファイルを生成する方法(日本語可能)のブログ記事にて掲載しています。
2.Apache FOPとの連携
Barcode4JをApache FOPのアドオンとして使用することにより、簡単にバーコードをPDFに出力できます。barcode4j.jarと、barcode4j-fop-ext.jarをクラスパスに追加します(ダウンロードサイトにあるbarcode4j-2.1.0-bin.zipに含まれています)。
3.XSL-FO文書への組み込み方
17行目のfo:instream-foreign-object要素下位に、Barcode4Jの独自の要素を追加します。名前空間は、http://barcode4j.krysalis.org/nsです。
18行目のbarcode要素のmessage属性で、バーコードの値を設定します。barcode要素の次は、バーコードの種類に対応した要素が出現します。下記の例の場合は、ean-128要素です。human-readable要素の子要素であるパターンpattern要素で目視文字の出力フォーマットを指定します。template要素では、AI、チェックディ ジットの計算方法とバーコードの内容(数字、英字の桁数)を指定します。AIは括弧でくくります。nは、数字、cdはチェックディ ジットを示します。cd0は チェックディ ジットの計算にAIを含む場合に使用します。template要素は任意で、message属性の値が、template要素で示した内容とあっているかどうか確認します。22行目の(91)n41+cd0は、AIは91、n41は41桁の数字、cd0は、AIと41桁の数字を含めたチェックディ ジットの計算結果を示します。またmodule-width要素でモジュール幅を指定できます。
図 1.barcode.fo
<?xml version="1.0" encoding="UTF-8" ?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master page-height="297mm" page-width="210mm" margin-top="0mm" margin-left="0mm" margin-right="0mm" margin-bottom="0mm" master-name="pageMaster">
<fo:region-body margin-top="30mm" margin-left="10mm" margin-right="10mm" margin-bottom="20mm" />
<fo:region-before display-align="after" region-name="header" extent="25mm" />
<fo:region-after region-name="footer" extent="15mm" />
<fo:region-start extent="8mm" />
<fo:region-end extent="8mm" />
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="pageMaster">
<fo:flow flow-name="xsl-region-body">
<fo:block>EAN-128</fo:block>
<fo:block>
<fo:instream-foreign-object>
<barcode xmlns="http://barcode4j.krysalis.org/ns" message="9176643219876543210987654321098765432109178">
<ean-128>
<height>15mm</height>
<module-width>0.21mm</module-width>
<template>(91)n41+cd0</template>
<human-readable>
<pattern>__________-____________________________-_-______-_</pattern>
</human-readable>
</ean-128>
</barcode>
</fo:instream-foreign-object>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
図 2.PDFバーコード付きPDF(クリックするとPDFを表示します。)

参照
FOP add-ons
http://xmlgraphics.apache.org/fop/resources.html#products-fop-add-ons
Instructions for the Apache FOP extension
http://barcode4j.sourceforge.net/2.1/fop-ext.html
©中條勝徳 and okulejp.com, 2012.