Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1189046
  • 博文数量: 89
  • 博客积分: 10546
  • 博客等级: 上将
  • 技术积分: 1510
  • 用 户 组: 普通用户
  • 注册时间: 2004-10-16 01:24
文章分类

全部博文(89)

文章存档

2012年(7)

2011年(4)

2010年(5)

2009年(52)

2008年(21)

分类: Java

2009-01-25 20:49:34

使用Apache FOP将Docbook转换成PDF文档
在翻译的 Spring Live 的时候,我就选择了使用 DocBook 来组织文档。但是当我试图使用 Apache FO 把它转换成 PDF 时,问题就出现了。
实际上,到现在为止,我都没有用FOP来真正的转换我的 DocBook 源文件。Spring Live 的PDF文档最终还是由 的 XEP 免费个人版来转换的。
使用Apache FOP,首先是要解决的是中文字体支持问题,操作起来比较复杂,一般要经历两个步骤。
1.要支持truetype字体,首先是要生成metrics文件,并且在fop配置文件中进行配置。
2.然后自定义xsl中字体相关的属性。
这里不再重复其步骤细节,具体可以参考:

使用FOP将中文DocBook xml转换成pdf的实现记录

用Google搜索的话可以更多的相关的解决方案,大多是针对早期的0.20.5的版本。

可喜的是最新的Apache FOP 0.95的字体配置已经大大简化,支持自动扫描。参见: 。

/usr/share/fonts/truetype/
 


第一种方法,在配置文件fonts 标签使用directory,指定字体目录,它有一个可选的属性recursive,设置为true的话,会查找子目录中安装的字体文件。
第二种方法,使用,它会自动扫描系统的字体目录,如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无法支持。比如我的设置为:

'Garamond','SimSun'
'Georgia','SimHei'


这种设置的好处是,英文中文分别使用不同的字体输出。
由于Docbook XML生成的FO文件中,默认字符输出使用character-by-character策略,FOP居然还是汉字当成英文字符来处理,导致汉字输出全部为方框。
在满江红翻译的Hibernate 中文文档时,使用FOP转换,正文仅设置使用了SimSun(这样文中的英文字符也是用SimSun生成的),导致文档字体千篇一律,整个文档看起来过于“朴素”。

当我从svn上取得最新的源代码,重新编译使用后,发现这个问题已经不存在了。现在 FOP 终于可以支持字体簇了,参见, 。
从源代码编译的方法参见:

生成的pdf效果如下。

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








阅读(4011) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

hantsy2011-11-24 16:40:10

文中的图片放在 Google Docs上,被墙了。

hantsy2011-11-24 16:38:38

应该是字体路径问题。。。不过最新版本,不用配置字体,能够自动扫描系统字体。

另外, FOP的字体排版不舒服,所以我也一直使用免费的 XEP来输出 PDF(代价是下面有一个广告链接)。

lwz866222011-11-24 10:26:36

兄弟,我用fop1.0和fop0.95,转换出来的PDF文件依然是中文显示成井号-"####",也是依据官网的配置来配的,可否给点你的建议,非常感谢!

chinaunix网友2009-12-29 14:46:21

你好,我想问一下xep中的中文字体配置又是怎样的呢? 我的email:yuxiangyu@sina.com 谢谢赐教