DocBook中文支持

mingdu.zheng <at> gmail <dot> com
http://blog.csdn.net/zoomdy/article/details/8779091

 

1. 简介

DocBook 本身是支持中文的,但需要一些额外的工作, 本文介绍如何为 DocBook XML 标签添加语言属性以支持中文标识; 介绍如何自定义样式表以输出 UTF-8 编码的 HTML 文件; 介绍如何生成字体信息文件以供 Fop 使用; 介绍自定义样式表以支持 PDF 书签和 PDF 中文字体; 介绍如何自定义 Fop 配置文件以支持嵌入中文字体。

本文使用 Eclipse 编辑 DocBook XML , 使用 Ant、Xalan、Fop 将 DocBook XML 转换成 HTML 和 PDF 格式, 如果您使用其它工具需要根据您使用的工具做相应的改动,特别是 Ant 脚本相关的部分, 如果您也希望使用上述工具编辑和转换 DocBook XML , 请参考《在 Eclipse 中构建 DocBook XML》

本文使用 DocBook XML 编辑并转换成 HTML 和 PDF,点击文章头部的“下载文章” 下载本文的 DocBook XML 源文件,包括 Ant 脚本、自定义样式表、配置文件。

2. 所需的 Eclipse 插件

编辑 DocBook XML 需要安装Eclipse XML Editors and Tools 和 Eclipse XSL Developer Tools 这两个插件,转换 DocBook XML 需要安装Eclipse Java Development Tools 插件, 不是要进行 Java 开发,而是要使用其中的 Ant 构建工具。 如果未安装上诉插件可以通过选择“Help > Install New Software…” 安装插件。

3. 显示“目录”而不是“Contents”

DocBook 转换过程会根据文档结构自动产生部分内容,例如文档目录, 默认情况下目录顶部显示的是“Contents”而不是“目录”, 为 DocBook XML 的根标签添加 xml:lang 属性为 “zh_cn”,让 DocBook 产生“目录”而不是“Contents”。

<article xml:lang="zh_cn">

4. 生成 UTF-8 编码的 HTML

默认情况下,DocBook 官方样式表使用“ISO-8859-1”编码, 在这种编码模式下中文将以 Unicode 编码的形式保存, 例如“中文支持”被存储成“&#20013;&#25991;&#25903;&#25345;”的形式, 这不影响浏览器对中文字符的解析,但是占用更多的存储空间,生成的 HTML 代码几乎没有可读性。

通过自定义样式表,可以将字符编码更改为更加通用的 “UTF-8” 编码, 新建 xsl 文件,命名为 html.xsl,文件内容为:

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:ng="http://docbook.org/docbook-ng"
                xmlns:db="http://docbook.org/ns/docbook"
                exclude-result-prefixes="db ng exsl"
                version='1.0'>

<!-- 引用官方样式表 -->
<xsl:include href="../docbook-xsl-1.78.1/html/docbook.xsl"/>

<!-- 更改输出选项,使用 UTF-8 编码 -->
<xsl:output method="html" encoding="UTF-8" indent="no"/>

</xsl:stylesheet>
note注意
根据 docbook-xsl 的存储路径和版本对引用路径作适当调整

修改 Ant 脚本,使用自定义样式表作为 HTML 转换的样式表

    ...
    <property name="html.stylesheet" value="${src.dir}/html.xsl" />
    ...

5. 生成支持中文的 PDF 文件

使用 Fop 生成 PDF 时, Fop 使用的默认字体不包含中文字符, 因此使用 Fop 生成中文 PDF 文件需要为 Fop 指定中文字体。

5.1. 生成字体描述信息文件

Fop 提供了生成字体描述信息文件的工具 “org.apache.fop.fonts.apps.TTFReader” 编辑 Ant 脚本,添加下述内容,让 Ant 为我们自动创建字体描述信息文件。

    <!--
        - target:  build-font
        - description:  生成PDF嵌入字体信息。
        -->
    <target name="build-font" depends="mkdir-out" 
        description="Build embedded fonts information">

        <!-- 生成TTF字体信息  -->
        <java fork="true" classname="org.apache.fop.fonts.apps.TTFReader">
            <classpath>
                <fileset dir="${fop.lib.dir}">
                    <include name="*.jar" />
                </fileset>
                <fileset dir="${fop.build.dir}">
                    <include name="fop.jar" />
                </fileset>
            </classpath>
            <arg value="C:\WINDOWS\Fonts\SimHei.ttf"/> <!-- TTF字体文件 -->
            <arg value="${out.dir}/SimHei.xml"/> <!-- 字体信息文件 -->
        </java>

        <!-- 生成TTC字体集中一种字体信息 -->
        <java fork="true" classname="org.apache.fop.fonts.apps.TTFReader">
            <classpath>
                <fileset dir="${fop.lib.dir}">
                    <include name="*.jar" />
                </fileset>
                <fileset dir="${fop.build.dir}">
                    <include name="fop.jar" />
                </fileset>
            </classpath>
            <arg value="-ttcname"/> <!-- 选择字体集中的一种字体 -->
            <arg value="SimSun"/> <!-- 选择的字体名称 -->
            <arg value="C:\WINDOWS\Fonts\SimSun.ttc"/> <!-- 字体集,包含多种字体 -->
            <arg value="${out.dir}/SimSun.xml"/> <!-- 字体信息文件 -->
        </java>

        <!-- 生成TTF字体信息  -->
        <java fork="true" classname="org.apache.fop.fonts.apps.TTFReader">
            <classpath>
                <fileset dir="${fop.lib.dir}">
                    <include name="*.jar" />
                </fileset>
                <fileset dir="${fop.build.dir}">
                    <include name="fop.jar" />
                </fileset>
            </classpath>
            <arg value="C:\WINDOWS\Fonts\TIMES.TTF"/> <!-- TTF字体文件 -->
            <arg value="${out.dir}/TimesNewRoman.xml"/> <!-- 字体信息文件 -->
        </java>
    </target>

调用 “build-font” 目标将生成 SimHei(黑体)、SimSun(宋体)、Times New Roman 三种字体的描述, 生成的文件分别为 SimHei.xml、SimSun.xml、TimesNewRoman.xml。

5.2. 自定义 Fop 配置文件

将 fop-1.1/conf/fop.xconf 拷贝一份到 src 目录,修改 src/fop.xconf, 添加嵌入字体相关选项。

    <renderer mime="application/pdf">
      <filterList>
        <value>flate</value>
      </filterList>
      <fonts>
          <!-- 中文字体:黑体  -->
          <font metrics-url="out/SimHei.xml" kerning="yes" embed-url="C:\WINDOWS\Fonts\SimHei.ttf">
                <font-triplet name="SimHei" style="normal" weight="normal"/>
          </font>

          <!-- 中文字体:宋体 -->
          <font metrics-url="out/SimSun.xml" kerning="yes" embed-url="C:\WINDOWS\Fonts\SimSun.ttc">
                <font-triplet name="SimSun" style="normal" weight="normal"/>
          </font>

          <!-- 英文字体:Times New Roman -->
            <font metrics-url="out/TimesNewRoman.xml" kerning="yes" embed-url="C:\WINDOWS\Fonts\Times.ttf">
                <font-triplet name="TimesNewRoman" style="normal" weight="normal"/>
          </font>
      </fonts>
    </renderer>

修改 Ant 脚本,为 Fop 添加 userconfig 选项,userconfig 指定使用自定义的配置文件。

        <fop format="application/pdf" fofile="${out.dir}/index.fo" 
            outfile="${out.dir}/index.pdf" userconfig="${src.dir}/fop.xconf" />

5.3. 自定义样式表

新建 xsl 文件,命名为 fo.xsl,文件内容为:

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:ng="http://docbook.org/docbook-ng"
                xmlns:db="http://docbook.org/ns/docbook"
                exclude-result-prefixes="db ng exsl"
                version='1.0'>

<xsl:include href="../docbook-xsl-1.78.1/fo/docbook.xsl"/>

<!-- 打开扩展功能,可生成PDF书签 -->
<xsl:param name="fop1.extensions" select="1"></xsl:param>

<!-- 设置文字字体 -->
<xsl:param name="body.font.family">SimSun,TimesNewRoman</xsl:param>      <!-- font family for body text -->
<xsl:param name="dingbat.font.family">SimSun,TimesNewRoman</xsl:param>   <!-- font family for copyright, quotes, and other symbols -->
<xsl:param name="monospace.font.family">SimSun,TimesNewRoman</xsl:param> <!-- font family for monospace environments -->
<xsl:param name="sans.font.family">SimSun,TimesNewRoman</xsl:param>      <!-- sans-serif font family -->
<xsl:param name="title.font.family">SimSun,TimesNewRoman</xsl:param>     <!-- font family for titles -->
<xsl:param name="symbol.font.family">Symbol,ZapfDingbats</xsl:param>     <!-- font families to be searched for symbols outside of the body font -->

<!-- 段落文字采用左对齐 -->
<xsl:param name="alignment">left</xsl:param>

</xsl:stylesheet>
note注意
根据 docbook-xsl 的存储路径和版本对引用路径作适当调整,多个字体使用英文逗号隔开。

修改 Ant 脚本,使用自定义样式表作为 PDF 转换的样式表

    ...
    <property name="fo.stylesheet" value="${src.dir}/fo.xsl" />
    ...

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值