2013年5月19日日曜日

[FOP]日本語対応

fop.jar 内にある org.apache.fop.fonts.apps.TTFReader を実行すると下記のように org.apache.commons.logging.LogFactory クラスが見つからないとエラーが出る
> java -cp c:\usr\share\java\build\fop.jar org.apache.fop.fonts.apps.TTFReader
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
この場合は java\lib 内に commons-logging-1.0.4.jar があるのでクラスに指定して実行する。
> java -cp c:\usr\share\java\build\fop.jar;c:\usr\share\java\lib\commons-logging-1.0.4.jar org.apache.fop.fonts.apps.TTFReader
TTF Reader for Apache FOP 1.0

java org.apache.fop.fonts.apps.TTFReader [options] fontfile.ttf xmlfile.xml

where options can be:
-d  Debug mode
-q  Quiet mode
-enc ansi
    With this option you create a WinAnsi encoded font.
    The default is to create a CID keyed font.
    If you're not going to use characters outside the
    pdfencoding range (almost the same as iso-8889-1)
    you can add this option.
-ttcname <fontname>
    If you're reading data from a TrueType Collection
    (.ttc file) you must specify which font from the
    collection you will read metrics from. If you read
    from a .ttc file without this option, the fontnames
    will be listed for you.
 -fn <fontname>
    default is to use the fontname in the .ttf file, but
    you can override that name to make sure that the
    embedded font is used (if you're embedding fonts)
    instead of installed fonts when viewing documents
    with Acrobat Reader.
commons.logging も指定してメイリオフォントを読み込ませるようにすると、次は org.apache.commons.io.IOUtils クラスが見つからないとエラーが出る
> java -cp c:\usr\share\java\build\fop.jar;c:\usr\share\java\lib\commons-logging-1.0.4.jar org.apache.fop.fonts.apps.TTFReader c:\WINDOWS\Fonts\meiryo.ttc meiryo.xml
TTF Reader for Apache FOP 1.0

Parsing font...
Reading c:\WINDOWS\Fonts\meiryo.ttc...
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/IOUtils
この場合は java\lib 内に commons-io-1.3.1.jar があるのでクラスに指定して実行する。
commons.io も指定すると TTFReader が動作するようになる。ここでは ttcname オプションを指定していないのでエラーが発生しているが、meiryo.ttc ファイルに含まれるフォント名が "Meiryo", "Meiryo Italic" の 2 つであることが分かる。
> java -cp c:\usr\share\java\build\fop.jar;c:\usr\share\java\lib\commons-logging-1.0.4.jar;c:\usr\share\java\lib\commons-io-1.3.1.jar org.apache.fop.fonts.apps.TTFReader c:\WINDOWS\Fonts\meiryo.ttc meiryo.xml
TTF Reader for Apache FOP 1.0

Parsing font...
Reading c:\WINDOWS\Fonts\meiryo.ttc...
This is a TrueType collection file with 2 fonts
Containing the following fonts:
Meiryo
Meiryo Italic
Error while building XML font metrics file.
java.lang.IllegalArgumentException: For TrueType collection you must specify which font to select (-ttcname)
ttcname オプションで "Meiryo" を選択すると org.apache.xmlgraphics.fonts.Gryphs クラスが見つからないとエラーが出る
> java -cp c:\usr\share\java\build\fop.jar;c:\usr\share\java\lib\commons-logging-1.0.4.jar;c:\usr\share\java\lib\commons-io-1.3.1.jar org.apache.fop.fonts.apps.TTFReader -ttcname "Meiryo" c:\WINDOWS\Fonts\meiryo.ttc meiryo.xml
TTF Reader for Apache FOP 1.0

Parsing font...
Reading c:\WINDOWS\Fonts\meiryo.ttc...
This is a TrueType collection file with 2 fonts
Containing the following fonts:
Meiryo <-- selected
Meiryo Italic
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlgraphics/fonts/Glyphs
この場合は java\lib 内に xmlgraphics-commons-1.3.1.jar があるのでクラスに指定して実行する
これで meriyo.ttc から meiryo.xml が生成できた
> java -cp c:\usr\share\java\build\fop.jar;c:\usr\share\java\lib\commons-logging-1.0.4.jar;c:\usr\share\java\lib\commons-io-1.3.1.jar;c:\usr\share\java\lib\xmlgraphics-commons-1.3.1.jar org.apache.fop.fonts.apps.TTFReader -ttcname "Meiryo" c:\WINDOWS\Fonts\meiryo.ttc meiryo.xml
TTF Reader for Apache FOP 1.0

Parsing font...
Reading c:\WINDOWS\Fonts\meiryo.ttc...
This is a TrueType collection file with 2 fonts
Containing the following fonts:
Meiryo <-- selected
Meiryo Italic
Font Family: [メイリオ, Meiryo]
Creating xml font file...
Creating CID encoded metrics...
Writing xml font file meiryo.xml...
This font contains no embedding license restrictions.

XML font metrics file successfully created.
Apache FOP を展開したディレクトリ以下の conf ディレクトリにある fop.xconf ファイルを開いてメイリオフォントの情報を追加する。<render mime="application/pdf"> 要素内の <fonts> 以下に使用するフォントを登録する。
<font metrics-url="file:///c:/usr/share/java/conf/meiryo.xml" kerning="yes" embed-url="file:///C:/WINDOWS/Fonts/meiryo.ttc">
  <font-triplet name="Meiryo" style="normal" weight="normal"/>
  <font-triplet name="Meiryo" style="normal" weight="bold"/>
</font>
上で生成した meiryo.xml も conf ディレクトリに置く
PDF 化するデータ (hello.fo) を準備
Example: hello.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 master-name="simple">
         <fo:region-body margin-top="3cm"/>
         <fo:region-before extent="3cm"/>
         <fo:region-after extent="3cm"/>
      </fo:simple-page-master>
   </fo:layout-master-set>

   <fo:page-sequence master-reference="simple">
      <fo:flow flow-name="xsl-region-body">
         <fo:block font-family="Meiryo" font-weight="normal" font-style="normal" font-size="18pt" text-align="center">
            こんにちは
         </fo:block>
      </fo:flow>
   </fo:page-sequence>
</fo:root>
PDF に変換する
c オプションで使用する conf ファイルを指定し、上記の hello.fo を PDF に変換する
>..\fop-0.95\fop.bat -c ..\fop-0.95\conf\fop.xconf hello.fo hello.pdf
2009/05/19 11:24:57 org.apache.fop.apps.FopFactoryConfigurator configure
情報: Default page-height set to: 11in
2009/05/19 11:24:57 org.apache.fop.apps.FopFactoryConfigurator configure
情報: Default page-width set to: 8.26in
2009/05/19 11:24:58 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: This is a TrueType collection file with 2 fonts
2009/05/19 11:24:58 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Containing the following fonts:
2009/05/19 11:24:58 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Meiryo <-- selected
2009/05/19 11:24:58 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Meiryo Italic
生成した PDF ファイルで正しく日本語が表示されていれば成功

XSL でフォントを指定する場合
Example: pdf_jp.xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output encoding="utf-8" indent="yes"/>
    <xsl:template match="/">
       <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" language="ja">
            <fo:layout-master-set>
                <fo:simple-page-master master-name="A4">
                    <fo:region-body margin="2cm"/>
                </fo:simple-page-master>
            </fo:layout-master-set>

            <xsl:apply-templates/>
        </fo:root>
    </xsl:template>

    <xsl:template match="/article">
        <fo:page-sequence master-reference="A4">
            <fo:flow flow-name="xsl-region-body">
                <xsl:apply-templates select="./info/title"/>
                <xsl:apply-templates select=".//para"/>
            </fo:flow>
         </fo:page-sequence>
    </xsl:template>

    <xsl:template match="//info/title">
        <fo:block font-family="Meiryo" font-weight="normal" font-style="normal" font-size="20pt"><xsl:apply-templates/></fo:block>
    </xsl:template>

    <xsl:template match="//para">
        <fo:block font-family="Meiryo" font-weight="normal" font-style="normal" font-size="10.5pt"><xsl:apply-templates/></fo:block>
    </xsl:template>
</xsl:stylesheet>
info - title, para 要素に対して font-family=Meiryo, font-weight=normal, font-style=normal を指定している
原稿となる XML ファイル (sample_pdf_jp.xml)
Example: sample_pdf_jp.xml
<?xml version="1.0" encoding="UTF-8"?>
<article version="5.0">
  <info>
    <title>Sample</title>
  </info>

  <para>Hello World</para>
  <para>こんにちは</para>
</article>
fop を使用して PDF 出力する
> c:\usr\share\java\fop.bat -c c:\usr\share\java\conf\fop.xconf -xml sample_pdf_jp.xml -xsl pdf_jp.xsl sample_jp.pdf
2011/04/13 13:53:14 org.apache.fop.apps.FopFactoryConfigurator configure
情報: Default page-height set to: 11in
2011/04/13 13:53:14 org.apache.fop.apps.FopFactoryConfigurator configure
情報: Default page-width set to: 8.26in
2011/04/13 13:53:15 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: This is a TrueType collection file with 2 fonts
2011/04/13 13:53:15 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Containing the following fonts:
2011/04/13 13:53:15 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Meiryo <-- selected
2011/04/13 13:53:15 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Meiryo Italic
参考: Apache FOPでPDF
参考: Apache FOP: Fonts

0 件のコメント:

コメントを投稿