曾经在windows下成功使用过docbook和fop,但在linux下一直没成功过,主要问题不消说也知道是字体的问题。在网上找了一些资料,总算成功了。虽然不算是最终和最佳解决方案,但毕竟是一个良好的开始。
系统:Fedora 12 i686
一. 安装docbook, libxslt, libxml2
su -c 'yum install docbook* libxslt libxml2' |
这是一个偷懒的办法,把凡是以docbook开头的包全装上,当然不是所有的包都必须。
二. 安装fop, avalon-framework, xmlgraphics-commons等
su -c 'yum install fop avalon-framework xmlgraphics-commons' |
这里装的是fop-0.95版本
不得不说一下,上面的安装过程,我不确定是否装全了,因为,我自己也忘了装过哪些包,而且,装一个包时有可能把其它包给连带装上了。因此,上面的过程并不精确。
装完docbook套装,就可以生成一些文档了,比如html。下面是一个文档示例,存为docbook.xml
<?xml version='1.0' encoding="UTF-8"?>
<!DOCTYPE article
PUBLIC "-//OASIS//DTD DocBook XML V4.5/zh_cn" "">
<article>
<info>
<title>文章</title>
<author>作者</author>
<address>地址</address>
<copyright><year>2008</year><holder>所有者</holder></copyright>
</info>
<sect1>
<title>标题</title>
<para>
内容
</para>
</sect1>
</article>
|
使用如下命令编译
xsltproc /usr/share/sgml/docbook/xsl-stylesheets/html/docbook.xsl docbook.xml >docbook.html |
就可以得到一个中文的网页。从这里看出,生成中文网页是完全没有问题的。另外,docbook套装中还有一些类似docbook2html, docbook2pdf等程序,其可用性较差,我初尝败绩之后就放弃了,还是用传统的xsltproc. 注意,docbook.xsl的位置与系统有关。
现在的问题就是如何生成中文的pdf文档。网上的资料显示用fop的比较多,所以我参考了一下他们的做法。
三. 生成字体配置文件
java -cp /usr/share/java/fop.jar:/usr/share/java/avalon-framework.jar:/usr/share/java/commons-io.jar:/usr/s hare/java/commons-logging.jar:/usr/share/java/xmlgraphics-commons.jar org.apache.fop.fonts.apps.TTFReader SimHei.ttf SimHei.xml
|
它的意思大致就是使用TTFReader这个java程序将SimHei.ttf这个字体的信息提取出来,放到SimHei.xml文件中。前面的一大串是java的运行环境,其中xmlgraphics-commons是我自己加的,因为我发现没这个库TTFReader根本运行不了,会提示NoDefClassFound之类的错误。注意,jar文件的具体位置可能与系统有关。
另外,TTFReader还支持ttc字体文件,ttc中的c实际上指的是集合,即ttc字体文件中包含了不止一个ttf字体。直接套用上面的命令,它会提示你怎么操作。其实,不一样的地方在于,你需要对ttc中的每个字体进行解析,每次都要加上-ttcname "SimSun"这样的信息。详情查看
据说,fop-0.95支持自动搜索系统中的字体和某个目录中的字体,参见,但我没有成功。
总之,我们获得了某些中文字体的配置文件,选一个地方把它放起来,比如/etc/fop/SimHei.xml。
四. fop配置文件
fop的默认配置文件一般在/usr目录中,我的在/usr/share/fop/conf/fop.xconf。具体可以用如下命令查看
将此fop配置文件拷到一个让你习惯的位置,比如/etc/fop/
mkdir /etc/fop cp /usr/share/fop/conf/fop.xconf /etc/fop/ |
这两条命令是需要root权限的。
修改此文件,找到标签,在中间加上一些东西
<fonts>
<font metrics-url="/etc/fop/SimHei.xml" kerning="yes"
embed-url="/YOUR_FONT_PATH/SimHei.ttf">
<font-triplet name="SimHei" style="normal" weight="normal"/>
<font-triplet name="SimHei" style="normal" weight="bold"/>
<font-triplet name="SimHei" style="italic" weight="normal"/>
<font-triplet name="SimHei" style="italic" weight="bold"/>
</font> </fonts>
|
fonts标签外面还套有其它一些标签,我就没列出来。font标签可以有多个,意味着可以加多个字体。注意,上面的metrics-url中的目录必须是绝对路径。
五. xsl样式文件
xml本身只有内容,其格式要用到样式表,即xsl文件。docbook提供了许多样式表,前面生成html时就用到了一种,但是,那些都没有考虑中文字体。
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl=""
xmlns:fo=""
xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
exclude-result-prefixes="doc"
version="1.0">
<xsl:import href="docbook.xsl"/>
<xsl:param name="body.font.family">SimHei</xsl:param>
<xsl:param name="body.font.size">12</xsl:param>
<xsl:param name="monospace.font.family">SimHei</xsl:param>
<xsl:param name="title.font.family">SimHei</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>
|
将上面的内容保存到/usr/share/sgml/docbook/
xsl-stylesheets/fo/docbook_zh.xsl。注意,具体的位置与系统有关。
之所以放在这个位置,是因为,这个目录下面有一个docbook.xsl文件,我们需要引用这个文件。这里只是在docbook.xsl的基础之上添加了中文字体SimHei而已。
六. 生成fo文件,再生成pdf文件。
网上的资料显示有人可以由xml文件直接用fop生成pdf,但是,我失败了。因此,只能先用xsltproc生成fo文件,然后,再用fop生成pdf。
xsltproc /usr/share/sgml/docbook/xsl-stylesheets/fo/docbook_zh.xsl mydoc.xml >mydoc.fo
fop -c /etc/fop/fop.xconf mydoc.fo mydoc.pdf |
七. 再次强调,本文中所用到的目录并不对每个人适用,你需要确定自己的docbook的安装位置和fop的安装位置
rpm -ql docbook-style-xsl rpm -ql fop |
参考:
阅读(2788) | 评论(0) | 转发(0) |