2011/04/20

oXygen XML 中文 PDF 輸出

一直用 oXygen 編輯器來處理 XML 相關檔案, 後來發覺寫文件的功能日益強大, 但輸出 PDF 有些障礙。也不是太大問題, 需要一些設定, 這裡的說明將包含 FO, Docbook, DITA。此外, 索引方面以 DITA 輸出為例, 示範更換 FO 處理器為 XEP 個人版。

以下環境是 OS X 10.6 加上 oXygen XML Editor 12.1。 請留意檔案位置, Windows 下注意 TTF 檔的差異。

另外, FO, Docbook, DITA 都有自由軟體套件, 協助編寫文件, 沒有 oXygen 編輯器也能運作。

FO 設定

  1. 產生字型規格檔, 參考: http://xmlgraphics.apache.org/fop/0.95/fonts.html

    假定把 FOP 1.0 安裝在 /w/j/x/fop-1.0 目錄。執行下列指令, 產生字型規格檔:

    $ export CL=/w/j/x/fop-1.0/build/fop.jar:/w/j/x/fop-1.0/lib/avalon-\
    framework.jar:/w/j/x/fop-1.0/lib/commons-logging.jar:/w/j/x/fop-\
    1.0/lib/commons-io.jar
    $ java -cp $CL org.apache.fop.fonts.apps.TTFReader \
    /Library/Fonts/Arial\ Unicode.ttf ArialUnicode.xml

    產生 ArialUnicode.xml, 放在 /w/proj/xml/fo/ArialUnicode.xml

  2. 建立 FOP 設定檔 userconfig.xml, 放在 /w/proj/xml/fo/userconfig.xml

    <fop version="1.0">
      <base>.</base>
      <renderers>
        <renderer mime="application/pdf">
          <filterList>
            <value>flate</value>
          </filterList>
          <fonts>
            <font metrics-url="file:///w/proj/xml/fo/ArialUnicode.xml" 
                embed-url="file:///Library/Fonts/Arial Unicode.ttf"
                kerning="yes">
              <font-triplet name="ArialUnicodeMS" style="normal"
               weight="normal"/>
              <font-triplet name="ArialUnicodeMS" style="normal"
               weight="bold"/>
              <font-triplet name="ArialUnicodeMS" style="italic"
               weight="normal"/>
              <font-triplet name="ArialUnicodeMS" style="italic"
               weight="bold"/>
              <font-triplet name="any" style="normal" weight="normal"/>
              <font-triplet name="any" style="normal" weight="bold"/>
            </font>
          </fonts>
        </renderer>
      </renderers>
      </fop>

    其中字型名稱 name="ArialUnicodeMS" 從 /w/proj/xml/fo/ArialUnicode.xml 裡頭的名稱參考而來。

  3. 修改 oXygen 設定 Preferences ➠ XML ➠ XSLT-FO-XQuery ➠ XQuery ➠ FO Processors

    找到 Configure file 項目改為 /w/proj/xml/fo/userconfig.xml

中文 FO 測試

  1. 編修原 oxygen/samples/fo/Miscellances/helloWorld.fo 改為 helloWorld-u8.fo:

    <?xml version="1.0" encoding="utf-8"?>
    <!-- Example from: http://www.renderx.net
      Copyright © 2004 RenderX, Inc.-->
    <fo:root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:fo="http://www.w3.org/1999/XSL/Format">
      <fo:layout-master-set>
        <fo:simple-page-master master-name="my-page">
          <fo:region-body margin="1in"/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="my-page">
        <fo:flow flow-name="xsl-region-body" font-family="ArialUnicodeMS">
          <fo:block>Hello, world! 大家好!</fo:block>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  2. 產生 PDF: 選單 Document ➠ Transformation ➠ Apply Transformation Senario 產生。

    或按 cmd + shift + T, 選擇 PDF (第一次要選 FO PDF)。

Docbook 設定

做妥上面 FO 設定。修改 oxygen/frameworks/docbook/xsl/fo/docbook_custom.xsl 在 </xsl:stylesheet> 前, <!-- end oXygen patch. --> 之後, 加上:

<!-- Traditional Chinese patch -->
<xsl:param name="body.font.family">ArialUnicodeMS</xsl:param>
<xsl:param name="body.font.size">12</xsl:param>
<xsl:param name="monospace.font.family">ArialUnicodeMS</xsl:param>
<xsl:param name="title.font.family">ArialUnicodeMS</xsl:param>
<!-- end Traditional Chinese patch -->

中文 Docbook 測試

  1. 修改 oxygen/samples/docbook/v5/sample.xml。Author 模式下, 在文字後加入中文, 例如:

    <sect1>
        <title>Inline Markup and Images 大家好</title>
  2. 產生 PDF, 同 FO 方式 ... cmd + shift + T 選擇 PDF (第一次要選 Docbook PDF)。

DITA 設定

  1. 修改 oxygen/frameworks/dita/DITA-OT/demo/fo/cfg/fo/font-mappings.xml

    找到以下字樣:

    <physical-font char-set="Simplified Chinese">
        <font-face>AdobeSongStd-Light</font-face>
    </physical-font>

    增加類似段落(共三處):

    <physical-font char-set="Traditional Chinese">
        <font-face>ArialUnicodeMS</font-face>
    </physical-font>
  2. 複製 oxygen/frameworks/dita/DITA-OT/demo/fo/cfg/fo/i18n/zh_CN.xml 成為同目下新檔 zh_TW.xml

    修改此 zh_TW.xml 內容, 把 <alphabet char-set="Simplified Chinese">...</alphabeat> 改為:

    <alphabet char-set="Traditional Chinese">
      <character-set>
        <character-range>
          <start include="yes">&#x0100;</start>
          <end include="yes">&#xff00;</end>
        </character-range>
      </character-set>
    </alphabet>

    很偷懶的方式, 需要修正。

  3. 修改 oxygen/frameworks/dita/DITA-OT/demo/fo/fop/conf/fop.xconf

    在 fop ☞ renderers ☞ renderer mime="application/pdf" ☞ fonts 下增加:

    <font metrics-url="file:///w/proj/xml/fo/ArialUnicode.xml"
        embed-url="file:///Library/Fonts/Arial Unicode.ttf" kerning="yes">
      <font-triplet name="ArialUnicodeMS" style="normal" weight="normal"/>
      <font-triplet name="ArialUnicodeMS" style="normal" weight="bold"/>
      <font-triplet name="ArialUnicodeMS" style="italic" weight="normal"/>
      <font-triplet name="ArialUnicodeMS" style="italic" weight="bold"/>
      <font-triplet name="any" style="normal" weight="normal"/>
      <font-triplet name="any" style="normal" weight="bold"/>
    </font>
  4. 建立 zh_TW 必要檔案, 在 oxygen/frameworks/dita/DITA-OT/demo/fo/cfg/common/ 下要有三個檔案:

    • index/zh_TW.xml

      複製 zh_CN.xml 修改, 先將 <language>zh-TW</language> 改為正確對應。下半部所有中文的 index.group 改為只有(也是需要修正):

      <index.group>
        <group.key>中文</group.key>
        <group.label>中文</group.label>
        <group.members>
          <char.set start-range="一" end-range="龤"/>
        </group.members>
      </index.group>
    • properties/zh_TW.properties

      chm.native.encoding=big5
      chm.project.language=0x404 Traditional Chinese
    • vars/zh_TW.xml

      複製修改, 可能必要的是 "Product Name"(顯示在 PDF 上方頁角), 其他隨意。

  5. 修改 oxygen/frameworks/dita/DITA-OT/demo/fo/build.xml 增加:

    <property name="document.locale" value="zh_TW"/>

    在 <property name="customization.dir ...> 上即可。

中文 DITA 測試

  1. 開 oxygen/dita/ 下某 DITA 專案, 開專案下的檔案在 Author 模式下修改, 增加中文字, 例如:

    <title>Changing the oil in your car 測試看看</title>
  2. 產生 PDF, 同 FO/Docbook 方式 ... cmd + shift + T 選擇 PDF (第一次要選 DITA Map PDF)。

安裝 XEP 個人版

FOP 1.0 還不支援索引(indexing)功能, 請參考 http://xmlgraphics.apache.org/fop/compliance.html#fo-object-indexing-section

XEP 個人版非商業用可取代 FOP 產生索引 http://www.renderx.com/download/personal.html

  1. 下載, 安裝到 /w/j/x/XEP/。

  2. 修改 /w/j/x/XEP/xep.xml 增加 (搜尋到 font-group):

    <font-group xml:base="file:/Users/tcchou/Library/Fonts/"
        label="Windows TrueType" embed="true" subset="true"> 
      <font-family name="ArialUnicodeMS">
        <font><font-data ttf="Arial Unicode.ttf"/></font>
      </font-family>
    </font-group>

    把 Arial Unicode.ttf 複製到個人字型目錄, 因為還有其他字型 ...

  3. oxygen 增加 XEP

    Preferences ➠ XML ➠ XSLT-FO-XQuery ➠ XQuery ➠ FO Processors

    點選 "If you have a custom XEP installation ..." 旁的 Browse 按鈕, 選擇 /w/j/x/XEP/xep 。

  4. 點選 "Configure Transformation Scenario", Duplicate "DITA Map PDF" 選擇 Processor: XEP 。

  5. 選擇 DITA 下專案(it-book 有 indexing 範例), 產生 PDF ... cmd + shift + T 。

0 comments: