日本語」タグのアーカイブ

Apache FOPのTIFF出力の方法   2 comments

1.はじめに
今日は、Apache FOPの機能を利用した、TIFF出力について説明したいと思います。システム開発において、FAX送信機能を実現するにあたり、TIFFイメージが必要なときがあると思います。Apache FOPを利用することで、同じXSL-FO文書を流用して、PDFだけでなく、TIFFも出力できます。

2.環境設定

  1. 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のダウンロードサイトへ
  2. 圧縮方式は、<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>
    
  3. 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に含まれています。)

  1. 67行目の「FOUserAgent foUserAgent = fopFactory.newFOUserAgent();」の後に、「fopFactory.setUserConfig(new File(“fop.xconf”));」を追加します。
  2. 77行目の「Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);」のMIME_PDFをMIME_TIFFに修正します。
  3. 128行目の「File fofile = new File(baseDir, “xml/fo/helloworld.fo”);」のファイル名を修正します。
  4. 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文書の解説

  1. 出力結果の項番18のセルは、fo:table-cell要素に、keep-together.within-column=”always”を指定しないと、複数ページに分割されます。
  2. ヘッダーは、項番、商品名、数量、単価、金額です。フッターは、合計、消費税、合計(税込)です。fo:table要素に、table-omit-footer-at-break=”true”を指定すると、フッターは繰り返されません。
  3. フッターには、fo:table-cell要素に、列の結合数を示す、number-columns-spanned属性と、行の結合数を示す、number-rows-spanned属性を使用しています。備考という文字は、結合されたセルに表示されています。
  4. 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.

okule による FOP, XML への投稿 (8月 2, 2012)

タグ: , , , , , , ,

Apache FOPの日本語禁則処理について   Leave a comment

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.

okule による FOP, XML への投稿 (7月 28, 2012)

タグ: , , , , ,

Apache FOPの可能性と日本語設定   1 comment

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 + テキストエディタ による帳票作成のメリットとデメリット。
●メリット

  1. 商用の大部分の帳票作成ツールは、メーカ独自のフォーマットを使用するが、標準技術のXSLT、XSL-FOとSVGで、GUIツールなしにテキストエディタで、実際に役立つ帳票を作成できる。
  2. 帳票のGUIツールは便利だが、XSLT、Apach FOPとSVGなら、テキストファイルを直に修正して、0.1mm単位の微調整ができる。
  3. SVGだけで帳票の様式ファイルをデザインすれば、ウェブブラウザで、すぐにデザインを確認できる。
  4. 帳票様式は、フォーム層とデータ層に分離でき、イラストレータなど、市販のSVG画像編集ソフトを使用してフォーム層の基礎部分を作成できる。(SVGの部分だけ、デザイナーに外注できる。)
  5. XSL-FOは、一つの帳票を複数の区画に分割できるので、一つの帳票を、同時に複数人で作成・修正でき、後で統合することが可能である。
  6. XML形式なので、プログラムソースのようにコメントを追加できる。
  7. XSL-FO形式で、ネイティブXMLデータベースで保存すれば、帳票内容のデータ分析を行うことができ、また再度、帳票を作成するときにデータを一から作成する必要がない。
  8. 無料である。デザインをするクライアント及び、帳票の作成を実行するサーバのライセンス料がかからない。メーカによるが、ライセンス料が、開発、評価及び本番環境を含めると、約数十万~数百万円くらいで、高機能すぎるがゆえにとても高価である。(気のせいか、昔に比べて、全体的に値段が高くなっているような気がする。オープンソースのツールの利用が増えて売り上げが落ちているのだろうか。)
  9. いろいろなファイル形式(PDF, PS, PCL, AFP, XML, Print, TIFF, AWT and PNG)に対応している。メーカ製なら、オプション扱いで別当料金が発生する場合がある。
  10. 負け惜しみであるが、帳票のGUIツールは頭をあまり使わなく便利である。しかし標準技術を使うことで、自由度は極めて高く、また頭を使って苦労するのでいいアイディアも生まれやすい。また帳票作成で使用したXMLに関する標準技術は、他の分野にも必ず役立つ。

●デメリット

  1. XSLT、XSL-FO及びSVGの仕様を覚える必要がある。
  2. 帳票のGUIツールに比べ、帳票作成の生産性が低い。会社で帳票のテンプレートをストックすることで、ある程度は解消できる。
  3. メーカ独自の便利な機能は、自前で実現しないといけない。(たいていの帳票作成ツールを提供するメーカには、メーカ独自の便利な機能がある。たとえば、ソート機能、合計機能、ある項目が変わったときの改ページ等。)

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.

okule による Barcode4J, FOP, SVG, XML への投稿 (7月 16, 2012)

タグ: , , , , , , , , , ,