linlu11 的博客

[收藏]使用Apache FOP将Docbook转换成PDF文档

http://blog.chinaunix.net/u/1096/showart_1808039.html

使用Apache FOP将Docbook转换成PDF文档
在翻译的 Spring Live 的时候,我就选择了使用 DocBook 来组织文档。但是当我试图使用 Apache FO 把它转换成 PDF 时,问题就出现了。
实际上,到现在为止,我都没有用FOP来真正的转换我的 DocBook 源文件。Spring Live 的PDF文档最终还是由 RenderX 的 XEP 免费个人版来转换的。
使用Apache FOP,首先是要解决的是中文字体支持问题,操作起来比较复杂,一般要经历两个步骤。
1. 要支持truetype字体,首先是要生成metrics文件,并且在fop配置文件中进行配置。
2.然后自定义xsl中字体相关的属性。
这里不再重复其步骤细节,具体可以参考:
Apache FOP: Configuration
使用FOP 将中文DocBook xml转换成pdf的实现记录
用Google搜索的话可以更多的相关的解决方案,大多是针对早期的 0.20.5的版本。
可喜的是最新的Apache FOP 0.95的字体配置已经大大简化,支持自动扫描。参见:Apache FOP: Fonts

<directory recursive="true">/usr/share/fonts/truetype/</directory>
  <!-- automatically detect operating system installed fonts -->
<auto-detect/>

第一种方法,在配置文件fonts 标签使用directory,指定字体目录,它有一个可选的属性recursive,设置为true的话,会查找子目录中安装的字体文件。
第二种方法,使用<auto-detect/>,它会自动扫描系统的字体目录,如Windows系统盘下的C:\Windows \Fonts,及Linux下的~/.fonts,/usr/share/fonts, /usr/local/share/fonts等。
第一次扫描之后,FOP会将字体信息写入cache,之后使用就会读cache了,不会再扫描字体了,默认cache存放位置是~/.fop/下面。建议在linux下指定directory的方式,不然的话cache文件体积也比较惊人。
但是FOP生成的pdf文档仍然无法让我满意。
当我想在设置font.family使用字体簇时,FOP 0.95无法支持。比如我的设置为:

<xsl:param name="body.font.family">'Garamond','SimSun'</xsl:param>
<xsl:param name="title.font.family">'Georgia','SimHei'</xsl:param>

这种设置的好处是,英文中文分别使用不同的字体输出。
由于Docbook XML生成的FO文件中,默认字符输出使用character-by-character策略,FOP居然还是汉字当成英文字符来处理,导致汉字输出全部为方框。
在满江红翻译的Hibernate 中文文档时,使用FOP转换,正文仅设置使用了SimSun(这样文中的英文字符也是用SimSun生成的),导致文档字体千篇一律,整个文档看起来过于 “朴素”。
当我从svn上取得最新的源代码,重新编译使用后,发现这个问题已经不存在了。现在 FOP 终于可以支持字体簇了,参见,FontSelectionStrategy
从源代码编译的方法参见:
Apache FOP: Building from Source Code
生成的pdf效果如下。

图中,上面部分是FOP生成的,下面是用XEP来生成的。FOP生成的文档依然有缺陷,中英字符的对齐方式与XEP有不同,如果用标准的英文书写所用四线格来说明的话,在FOP中生成的中文底部是与英文底线持平的,而在XEP,中文相对来说向上移了一格,看起来也比较美观。
其它中文问题,如换行时标点位置判断的问题,list的前面的符号显示问题,还没有进行测试。

posted on 2010-05-21 00:34  linlu11  阅读(1059)  评论(0编辑  收藏  举报

导航