人気ブログランキング | 話題のタグを見る
ブログトップ
Apache FOPと外字印刷
 最近、動的なWEBページ(帳票など)をPDFファイルに変換し印刷するというWEB印刷の仕事をやっています。今、Apache FOPを使ってこの機能要求を実現しようとしています。
 FOPとは、XSL FOからPDF文書を作成するJavaライブラリです。XMLとXSL(XSLT)でFOを作り、それをPDFに変換することも可能です。そしてこちらが主流となっています。
 FOPはフリーソフトで、以下のURLからダウンロード可能で現在(2005/03/16)の最新バージョンは0.20.5です。http://xml.apache.org/fop/

  FOPを使う際、どんなフォントを使用するのかは、FOPのキーとなっているでしょう。FOPではデフォルトで数種類のフォントが用意されています。デフォルトのフォント以外のフォント(たとえば日本語)を使いたい(FOPに追加したい)場合、環境設定しなければなりません。なお、FOPに追加できるフォントはType1フォントとTrue Typeフォントです。
 たとえば、MS明朝を使うための環境設定は以下のとおり:
(1) font metricsファイルの作成
font metricsファイルというのは、Font情報を記述したxmlファイルです。作成するには、org.apache.fop.fonts.appsパッケージのツールを使います。FOPに追加できるフォントはType1フォントとTrue Typeフォントです。 (Type1とTrue Typeってよく知りませんが、 こちらによると、世界標準の2大アウトラインフォントらしい)
 ここではWindowsに標準で付いてるTrue Typeフォントを例に話を進めます。 MS明朝をFOPに組み込んでみましょう。True Typeフォントは、うちの環境(Windows XP)の場合、 C:\WINDOWS\Fonts に入ってます。 .ttf、.ttcという拡張子のファイルがたくさん入っています。 ttfがTrue Type Fontで、 ttcの方はTrue Type FontのCollection(複数入ったもの)ではないかと思われます(たぶん)。
 コマンドラインで、org.apache.fop.fonts.apps.TTFReaderを使って、 True Typeのコレクションファイルmsmincho.ttcから font metricsファイルmsmincho.xml を作ってみましょう。
C:\fop>java -cp build/fop.jar;lib/xercesImpl-2.2.1.jar;lib/xalan-2.4.1.jar;lib/batik.jar org.apache.fop.fonts.apps.TTFReader -ttcname "MS Mincho" C:/WINDOWS/Fonts/msmincho.ttc msmincho.xml
(実際は一行)

(2) userconfig.xmlの編集
 confディレクトリのuserconfig.xmlを編集します。以下のような記述をします。デフォルトのuserconfig.xmlに日本語フォント記述のサンプルがあるので、それをコピーして書き換えればいいかなと思います。

 <font metrics-file="msmincho.xml" embed-file="C:\windows\fonts\msmincho.ttc" kerning="yes">
  <font-triplet name="Mincho" style="normal" weight="normal"/>
  <font-triplet name="Mincho" style="normal" weight="bold"/>
  <font-triplet name="Mincho" style="italic" weight="normal"/>
  <font-triplet name="Mincho" style="italic" weight="bold"/>
 </font>

(3) userconfig.xmlを指定して実行
日本語フォントを使ったfoを用意しましょう。
jp.fo(hello.foの以下だけ編集)
<fo:block font-size="18pt" text-align="center"
font-family="Mincho">
はろーFOP
</fo:block>
FOPを実行します。このとき、-cオプションでuserconfig.xmlを指定します。
C:\apps\fop-0.20.4>fop -c conf/userconfig.xml jp.fo jp.pdf
日本語もちゃんと出てますね~。
ちなみに、このあたりの基本的な情報は、FOPドキュメントのfontsのところに書いてます。
userconfig.xmlを指定して実行(組み込み)
Javaプログラムから実行する場合も簡単です。以下のようにOptionsを使います。

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

import org.apache.fop.apps.Driver;
import org.apache.fop.apps.Options;
import org.xml.sax.InputSource;

public class JpFont {

public static void main(String[] args) throws Exception{

InputSource foFile = new InputSource("jp.fo");
OutputStream out = new FileOutputStream("jp.pdf");

//これだけでstaticなコンフィグ設定になるらしい
File userConfigFile = new File("userconfig.xml");
Options options = new Options(userConfigFile);

Driver driver = new Driver(foFile, out);
driver.setRenderer(Driver.RENDER_PDF);
driver.run();
}
}


以上で、とりあえず日本語MS明朝の印刷は可能となっておりました。
しかし、今は銀行関係の仕事で、実際の帳票では「㈱」や「(財)」などの外字を一般的に使われております。
LinuxなどFOPを使用する場合、外字リンクが無効となっています。外字を印刷するためには、外字付きのフォントを新しく作らないといけないのです。
外字付きフォントを作成するには、シェアウェア「TTEdit」をダウンロードしてください。5000円のシェアウェアでちょっと高いと思われるかもしれないが、1ヶ月のお試し期間があり、ちょっとだけ使うのに本当に有り難い。
外字付きフォント作成の手順は以下のとおり:
① TTEditかWindows内蔵の「外字エディタ」で、必要な外字を作成する。
② 外字作成後,C:\Windows\Fontsの配下に、「EUDC.TTE」が生成されるはず。このファイルを作業フォルダにコピーし、「EUDC.TTF」にリネームする。そして、リネーム後のTTFファイルを再度Windows\Fontsの配下に入れてください。(フォントのインストールになる)
③ TTEditのホームページから、外字領域付フォントを<ダウンロードする
④ TTEdditを起動し、メニューの「ファイル」から「一括コピー」を選択する。一括コピーの画面で、参照「コピー元ファイル」はWindows\FontsのEUDC.TTFを選んで、「コピー先ファイル」は先ほどダウンロードした空の外字領域付フォントファイルに選んでください。そしてOKボタンを押して、外字は外字領域付フォントファイルにコピーされる。
⑤ 外字領域付フォントに、外字以外の文字を設定するには、④番の手順でコピーしたフォント、たとえば、MS明朝の場合、「MSMINCHO.TTC」をコピー元ファイルとして、一括コピー実行すれば、外字領域付明朝フォントの出来上がり。
 そして、先述した環境設定の手順で、外字領域付明朝フォントを使って設定すれば、PDFの印刷で、外字も化けずにちゃんと印刷できると思います。
by ayuoffice | 2005-03-16 20:57 | IT情報