8.10下面把中文docbook转换为pdf

系统字体配置、中文显示和输入法问题
回复
caozhzh
帖子: 21
注册时间: 2005-12-21 17:37

8.10下面把中文docbook转换为pdf

#1

帖子 caozhzh » 2009-04-06 23:51

这两天一直在鼓捣这个,上网找了很多资料,终于有点收获,写出来抛砖引玉。
首先,有些链接很有帮助:
使用FOP将中文DocBook xml转换成pdf的实现记录
使用Apache FOP将Docbook转换成PDF文档
Apache FOP: Fonts
1、准备工作
docbook转换为pdf有很多方式,我用的是docbook->fo->pdf
为此需要安装fop,另外,我也安装了xmlto(使用xsltproc应该也可以),当然还要有docbook-xsl。
2、配置工作
这部分是花费时间最多的。主要的原因是上面提到的资料中有很多不是针对ubuntu8.10的,所以有些配置文件找不到地方,下面是详细的步骤:
第一个配置是把docbook转换为fo使用的xsl,系统缺省使用/usr/share/xml/docbook/stylesheet/nwalsh/fo/docbook.xsl。由于需要使用中文,所以需要自己定义一个。我的文件名是myfo.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:import href="/usr/share/xml/docbook/stylesheet/nwalsh/fo/docbook.xsl" />
<xsl:param name="body.font.family">WenQuanYiZenHei</xsl:param>
<xsl:param name="body.font.size">10</xsl:param>
<xsl:param name="monospace.font.family">Monaco</xsl:param>
<xsl:param name="title.font.family">WenQuanYiZenHei</xsl:param>
<xsl:param name="page.margin.inner">2cm</xsl:param>
<xsl:param name="page.margin.outer">2cm</xsl:param>
<xsl:param name="hyphenate">false</xsl:param>
<xsl:param name="paper.type" select="'A4'" />
<xsl:param name="draft.mode" select="'no'" />
</xsl:stylesheet>

需要注意的就是红色部分的字体,需要指定中文字体,ubuntu下面用的是文泉驿的字体,所以就用WenQuanYiZenHei。
第二个配置文件是字体相关文件,上面的资料里面提到使用java org.apache.fop.fonts.apps.TTFReader C:\WINNT\Fonts\simsun.ttc simsun.xml 或者是类似的方式,可是我在实验的过程中发现ubuntu的fop包里面包含了一个fop-ttfreader脚本,很容易使用,在命令行键入:

代码: 全选

fop-ttfreader /usr/share/fonts/truetype/wqy/wqy-zenhei.ttf ./wqy-zenhei.xml
就可以了。
第三个是需要把上面生成的xml告诉fop,需要修改或者新建一个fop.xconf文件。这个文件在ubuntu的fop包里面没有,我去
http://svn.apache.org/viewvc/xmlgraphic ... nf?view=co下载了一个,并且做了以下修改:
<font metrics-url="wqy-zenhei.xml" kerning="yes" embed-url="/usr/share/fonts/truetype/wqy/wqy-zenhei.ttf">
<font-triplet name="WenQuanYiZenHei" style="normal" weight="normal"/>
</font>

至此,配置工作基本结束。另外,上面三个配置文件我都放在~/work/docbook/目录下面,和我的docbook文档放在一起。
3、转换工作
这个就比较简单了,先通过myfo.xsl把docbook的文档转换为fo文件:

代码: 全选

xmlto -x myfo.xsl fo test.xml
得到了一个test.fo文件
然后,使用fop命令:

代码: 全选

fop -c fop.xconf test.fo test.pdf
这样就可以在test.pdf中看到中文了。
实际上,这些工作很多地方都有介绍,包括我上面提到的三个帖子。不过,由于我使用的ubuntu中提供的包,有些具体的细节大部分资料里面都没有提到,所以写个帖子算是记录一下吧。
另外,中文断字还有字体簇的支持我还没有试,不过参考上面几个帖子应该不是难事。
djstava
帖子: 56
注册时间: 2007-12-27 10:13
来自: shanghai

Re: 8.10下面把中文docbook转换为pdf

#2

帖子 djstava » 2009-05-13 17:00

照楼上的做了,转成PDF后中文还是显示为#,不知道是为什么?
最后操作好像有点问题

djstava@djstava:~/execise/docbook$ sudo fop -c fop.xconf test.fo test.pdf
[warning] /usr/bin/fop: Unable to locate servlet-api in /usr/share/java
2009-5-13 16:56:55 org.apache.fop.apps.FopFactoryConfigurator configure
信息: Default page-height set to: 11in
2009-5-13 16:56:55 org.apache.fop.apps.FopFactoryConfigurator configure
信息: Default page-width set to: 8.26in
2009-5-13 16:56:56 org.apache.fop.fonts.FontInfo notifyFontReplacement
警告: Font 'Symbol,normal,700' not found. Substituting with 'Symbol,normal,400'.
2009-5-13 16:56:56 org.apache.fop.fonts.FontInfo notifyFontReplacement
警告: Font 'ZapfDingbats,normal,700' not found. Substituting with 'ZapfDingbats,normal,400'.
2009-5-13 16:56:56 org.apache.fop.fonts.FontInfo notifyFontReplacement
警告: Font 'WenQuanYiZenHei,normal,700' not found. Substituting with 'any,normal,700'.
回复