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 编码的形式保存, 例如“中文支持”被存储成“中文支持”的形式, 这不影响浏览器对中文字符的解析,但是占用更多的存储空间,生成的 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>
注意 | |
---|---|
根据 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>
注意 | |
---|---|
根据 docbook-xsl 的存储路径和版本对引用路径作适当调整,多个字体使用英文逗号隔开。 |
修改 Ant 脚本,使用自定义样式表作为 PDF 转换的样式表
...
<property name="fo.stylesheet" value="${src.dir}/fo.xsl" />
...