DITA-OT1.4.3のPDF出力を日本語化する(Apache FOP編)

mitsu48さんの指摘で、「XSLの中の、フォント・ファミリー指定の変更」が不要なことがわかりましたので、手順から削除しました。

最初にコメントしますが、現状のApache FOPで製品品質のPDFを作るのは、多分無理。
それでも、

  • RenderX XEP Personal版は商用には使えない
  • フッタ部分にRenderXのURLとロゴが入る

のがイヤな人は、Apache FOPを試してみては。

RenderX XEPとApache FOPを比べると、以下のような主要な違いがある。

FO Formatter RenderX XEP Apache FOP
フォントメトリクスの指定 不要 必要
索引生成 ×
目次のハイパーリンク ×
日本語化の手間 比較的楽 少し大変

FOPの方がフォントメトリクス指定が煩雑な分、日本語化の手間がかかる。

なお、アンテナハウスのXSL Formatterは、RenderX XEPと同等かそれ以上の機能を持っているらしい。
評価版はあるが、フリーで使えるものがないので試していない。

DITA-OT1.4.3には、Apache FOP Ver0.95が含まれている。
DITA-OT1.4.3のApache FOPによるPDF出力を日本語化するための手順を以下に示す。

参考にしたページ

前提条件

  • JRE or JDK Ver1.5以降のインストールが完了していること
  • DITA-OT 1.4.3のインストールが完了していること

フォントメトリクス・ファイルの準備

  • Apache FOPのTTFReaderツールを使って、MS ゴシックとMS 明朝のフォントメトリクス・ファイルを作る。フォントメトリクス・ファイルをまとめて作るバッチ(jp_fonts.bat)を作ったので、これを使う。
jp_fonts.bat
@echo off

echo Apache FOPで日本語フォントを扱えるようにするためのバッチ
echo.

REM  概要:
REM   Apache FOPで日本語フォントを扱えるようにするためのバッチ
REM
REM  詳細:
REM   本バッチは、MS明朝とMSゴシックのフォント・メトリクス・ファイルをjp_fontsフォ
REM   ルダの下に作ります。
REM
REM  補足:
REM   PDFを日本語化するには、本バッチにより生成したフォント・メトリクス・ファイ
REM   ルの他に、日本語フォントの情報を定義したuserconfig.xmlファイルが必要です。
REM   userconfig.xmlは、DITA-OTを実行するときに指定されます。
REM   ・Antを使ってDITA-OTを実行する場合
REM     args.fo.userconfigパラメータに、userconfig.xmlを指定する
REM   ・dost.jarを使ってDITA-OTを実行する場合
REM     dost.jarを実行するときに、引数として /fouserconfig:%DITA_DIR%userconfig.xml を指定する

REM  OSのチェック(本バッチはWindows XP上でのみ動作する)

if not "%OS%"=="Windows_NT" goto OS_ERROR

REM  以降は、start.batのコピー
REM  --- ここから ---
REM  This file is part of the DITA Open Toolkit project hosted on 
REM  Sourceforge.net. See the accompanying license.txt file for 
REM  applicable licenses.
REM  (c) Copyright IBM Corp. 2006 All Rights Reserved.

REM Get the absolute path of DITAOT's home directory
set DITA_DIR=%~dp0

REM Set environment variables
set ANT_OPTS=-Xmx800m %ANT_OPTS%
set ANT_OPTS=%ANT_OPTS% -Djavax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl
set ANT_HOME=%DITA_DIR%tools\ant
set PATH=%DITA_DIR%tools\ant\bin;%PATH%
set CLASSPATH=%DITA_DIR%lib;%DITA_DIR%lib\dost.jar;%DITA_DIR%lib\resolver.jar;%DITA_DIR%lib\icu4j.jar;%CLASSPATH%
set CLASSPATH=%DITA_DIR%lib\saxon\saxon9.jar;%DITA_DIR%lib\saxon\saxon9-dom.jar;%CLASSPATH%
set CLASSPATH=%DITA_DIR%lib\saxon\saxon9-dom4j.jar;%DITA_DIR%lib\saxon\saxon9-jdom.jar;%CLASSPATH%
set CLASSPATH=%DITA_DIR%lib\saxon\saxon9-s9api.jar;%DITA_DIR%lib\saxon\saxon9-sql.jar;%CLASSPATH%
set CLASSPATH=%DITA_DIR%lib\saxon\saxon9-xom.jar;%DITA_DIR%lib\saxon\saxon9-xpath.jar;%DITA_DIR%lib\saxon\saxon9-xqj.jar;%CLASSPATH%
REM --- ここまで ---

set LOCAL_FOP_HOME=%~dp0demo\fo\fop\

set LIBDIR=%LOCAL_FOP_HOME%lib
set LOCALCLASSPATH=%LOCAL_FOP_HOME%build\fop.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\xml-apis-1.3.04.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\xml-apis-ext-1.3.04.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\xercesImpl-2.7.1.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\xalan-2.7.0.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\serializer-2.7.0.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\batik-all-1.7.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\xmlgraphics-commons-1.3.1.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\avalon-framework-4.2.0.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\commons-io-1.3.1.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\commons-logging-1.0.4.jar

mkdir .\jp_fonts

echo.
echo MS ゴシックのフォントメトリクス・ファイル作成中...
java -cp "%LOCALCLASSPATH%" org.apache.fop.fonts.apps.TTFReader -ttcname "MS Gothic"    C:\WINDOWS\Fonts\MSGOTHIC.TTC .\jp_fonts\msgothic.xml
echo.
echo MS Pゴシックのフォントメトリクス・ファイル作成中...
java -cp "%LOCALCLASSPATH%" org.apache.fop.fonts.apps.TTFReader -ttcname "MS PGothic"   C:\WINDOWS\Fonts\MSGOTHIC.TTC .\jp_fonts\mspgothic.xml
echo.
echo MS UIゴシックのフォントメトリクス・ファイル作成中...
java -cp "%LOCALCLASSPATH%" org.apache.fop.fonts.apps.TTFReader -ttcname "MS UI Gothic" C:\WINDOWS\Fonts\MSGOTHIC.TTC .\jp_fonts\msuigothic.xml
echo.
echo MS 明朝のフォントメトリクス・ファイル作成中...
java -cp "%LOCALCLASSPATH%" org.apache.fop.fonts.apps.TTFReader -ttcname "MS Mincho"    C:\WINDOWS\Fonts\MSMINCHO.TTC .\jp_fonts\msmincho.xml
echo.
echo MS P明朝のフォントメトリクス・ファイル作成中...
java -cp "%LOCALCLASSPATH%" org.apache.fop.fonts.apps.TTFReader -ttcname "MS PMincho"   C:\WINDOWS\Fonts\MSMINCHO.TTC .\jp_fonts\mspmincho.xml
echo.

goto END

:OS_ERROR
echo 本バッチは、Windows XP上でのみ動作します。
echo.

:END
set ANT_OPTS=
set CLASSPATH=
set LOCALCLASSPATH=

echo フォントメトリクス・ファイルとuserconfig.xmlの作成完了
echo.
pause
  • jp_fonts.batを%DITA-OT%の下に置き実行する。これにより、jp_fontsフォルダができ、その中に以下のフォントメトリクス・ファイルが生成される。
  • TTFReaderにバグがあるようで、上記フォントメトリクス・ファイルのうち、msgothic.xml, msmincho.xml, mspgothic.xmlのfamily-nameタグのコンテンツが文字化けする。テキスト・エディタを使って、それぞれMS ゴシック、MS 明朝、MS Pゴシックに修正する。このとき、フォントメトリクス・ファイルを必ずUTF-8で保存すること。

mitsu48さんが紹介してくださった下記のページに、TTFReaderのバグを修正したfop.jarがあります。修正版のfop.jarを使うと、フォントメトリクス・ファイルをテキスト・エディタで修正する必要がなくなります。
Apache FOP の 無設定 日本語フォント対応 (Windows向け)

build.xmlの修正

  • %DITA-OT%demo\fo\build.xml の中で、document.locale というプロパティを設定しているので、この値を ja_JP に変える。このことについては、DITA Open Toolkit User Guideの"Localizing in PDF2 output target"に書いてある。このlocaleに指定により、自動生成文字や索引の出来方も日本語仕様になる。
  • build.xmlのデフォルトの設定では、DITA-OT実行後にXSL-FOのファイルが削除される。デバッグのためにXSL-FOを残しておきたい場合は、build.xml の中の、transform.topic2pdfターゲットの定義の中の、deleteの部分をコメント・アウトする。
<!--delete-->
  <!--Deleting the stage files isn't necessary, since it will be cleaned by
      clean-temp, and is useful for debugging.-->
  <!--<fileset dir="${buildDir}" includes="stage?.*"/>-->
  <!--fileset dir="${dita.map.output.dir}" includes="topic.fo"/-->
<!--/delete-->

フォント・マッピングのカスタマイズ

  • フォント・マッピングをカスタマイズするために、%DITA-OT%demo\fo\cfg\fo\font-mappings.xml を %DITA-OT%demo\fo\Customization\fo の下にコピーする。
  • %DITA-OT%\demo\fo\Customization\fo\font-mappings.xml を編集し、日本語フォントの指定箇所を以下のとおり変更する。
<font-mappings>

  <font-table>

    <aliases>
      <alias name="Helvetica">Normal</alias>
    </aliases>
    <aliases>
      <alias name="Courier">Monospaced</alias>
    </aliases>

    <logical-font name="Sans">
      <physical-font char-set="default">
        <font-face>Helvetica</font-face>
      </physical-font>
      <physical-font char-set="Simplified Chinese">
        <font-face>AdobeSongStd-Light</font-face>
      </physical-font>
      <physical-font char-set="Japanese">
        <!--<font-face>KozMinProVI-Regular</font-face>-->
        <font-face>MSGothic</font-face>
      </physical-font>
      <physical-font char-set="Korean">
        <font-face>AdobeMyungjoStd-Medium</font-face>
      </physical-font>
      <physical-font char-set="Symbols">
        <font-face>ZapfDingbats</font-face>
      </physical-font>
      <physical-font char-set="SubmenuSymbol">
        <font-face>ZapfDingbats</font-face>
      </physical-font>
      <physical-font char-set="SymbolsSuperscript">
        <font-face>Helvetica</font-face>
        <baseline-shift>20%</baseline-shift>
        <override-size>smaller</override-size>
      </physical-font>
    </logical-font>

    <logical-font name="Serif">
      <physical-font char-set="default">
        <font-face>Times</font-face>
      </physical-font>
      <physical-font char-set="Simplified Chinese">
        <font-face>AdobeSongStd-Light</font-face>
      </physical-font>
      <physical-font char-set="Japanese">
        <!--<font-face>KozMinProVI-Regular</font-face>-->
        <font-face>MSMincho</font-face>
      </physical-font>
      <physical-font char-set="Korean">
        <font-face>AdobeMyungjoStd-Medium</font-face>
      </physical-font>
      <physical-font char-set="Symbols">
        <font-face>ZapfDingbats</font-face>
      </physical-font>
      <physical-font char-set="SubmenuSymbol">
        <font-face>ZapfDingbats</font-face>
      </physical-font>
      <physical-font char-set="SymbolsSuperscript">
        <font-face>Times</font-face>
        <baseline-shift>20%</baseline-shift>
        <override-size>smaller</override-size>
      </physical-font>
    </logical-font>

    <logical-font name="Monospaced">
      <physical-font char-set="default">
        <font-face>Courier</font-face>
      </physical-font>
      <physical-font char-set="Simplified Chinese">
        <font-face>AdobeSongStd-Light</font-face>
      </physical-font>
      <physical-font char-set="Japanese">
        <!--<font-face>KozMinProVI-Regular</font-face>-->
        <font-face>MSGothic</font-face>
      </physical-font>
      <physical-font char-set="Korean">
        <font-face>AdobeMyungjoStd-Medium</font-face>
      </physical-font>
      <physical-font char-set="Symbols">
        <font-face>ZapfDingbats</font-face>
      </physical-font>
      <physical-font char-set="SymbolsSuperscript">
        <font-face>Courier</font-face>
        <baseline-shift>20%</baseline-shift>
        <override-size>smaller</override-size>
      </physical-font>
    </logical-font>
  </font-table>

</font-mappings>
  • font-mappings.xml のカスタマイズを有効にするために、%DITA-OT%demo\fo\Customization\catalog.xml を修正する。catalog.xml.orig をコピーして catalog.xml を作り、FontMapperのコメントを解除する。
    <!-- FontMapper configuration override entry.-->
    <uri name="cfg:fo/font-mappings.xml" uri="fo/font-mappings.xml"/>

fop.xconfの修正

  • %DITA-OT%demo\fo\fop\conf\fop.xconfに、日本語フォントのフォントメトリクス・ファイルを参照するための記述を追加する。
    :
<fonts>

  <!-- Fontmetrics for Japanese fonts -->

  <font metrics-url="file:///C:/DITA-OT1.4.3/jp_fonts/msuigothic.xml" embed-url="file:///C:/windows/fonts/msgothic.ttc" kerning="yes">
    <font-triplet name="MSUIGothic" style="normal" weight="normal"/>
    <font-triplet name="MSUIGothic" style="normal" weight="bold"/>
    <font-triplet name="MSUIGothic" style="italic" weight="normal"/>
    <font-triplet name="MSUIGothic" style="italic" weight="bold"/>
  </font>

  <font metrics-url="file:///C:/DITA-OT1.4.3/jp_fonts/msgothic.xml" embed-url="file:///C:/windows/fonts/msgothic.ttc" kerning="yes">
    <font-triplet name="MSGothic" style="normal" weight="normal"/>
    <font-triplet name="MSGothic" style="normal" weight="bold"/>
    <font-triplet name="MSGothic" style="italic" weight="normal"/>
    <font-triplet name="MSGothic" style="italic" weight="bold"/>
  </font>

  <font metrics-url="file:///C:/DITA-OT1.4.3/jp_fonts/mspgothic.xml" embed-url="file:///C:/windows/fonts/msgothic.ttc" kerning="yes">
    <font-triplet name="MSPGothic" style="normal" weight="normal"/>
    <font-triplet name="MSPGothic" style="normal" weight="bold"/>
    <font-triplet name="MSPGothic" style="italic" weight="normal"/>
    <font-triplet name="MSPGothic" style="italic" weight="bold"/>
  </font>

  <font metrics-url="file:///C:/DITA-OT1.4.3/jp_fonts/msmincho.xml" embed-url="file:///C:/windows/fonts/msmincho.ttc" kerning="yes">
    <font-triplet name="MSMincho" style="normal" weight="normal"/>
    <font-triplet name="MSMincho" style="normal" weight="bold"/>
    <font-triplet name="MSMincho" style="italic" weight="normal"/>
    <font-triplet name="MSMincho" style="italic" weight="bold"/>
  </font>

  <font metrics-url="file:///C:/DITA-OT1.4.3/jp_fonts/mspmincho.xml" embed-url="file:///C:/windows/fonts/msmincho.ttc" kerning="yes">
    <font-triplet name="MSPMincho" style="normal" weight="normal"/>
    <font-triplet name="MSPMincho" style="normal" weight="bold"/>
    <font-triplet name="MSPMincho" style="italic" weight="normal"/>
    <font-triplet name="MSPMincho" style="italic" weight="bold"/>
  </font>

</fonts>
    :

これで一応、日本語フォントが表示できるようになりますが、まだ、文字化けや文字の欠落が残っています。