Chinaunix首页 | 论坛 | 博客
  • 博客访问: 260979
  • 博文数量: 41
  • 博客积分: 2013
  • 博客等级: 大尉
  • 技术积分: 523
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-08 23:13
文章分类

全部博文(41)

文章存档

2010年(41)

我的朋友

分类: LINUX

2010-04-01 10:36:43

曾经在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。具体可以用如下命令查看

rpm -ql fop


将此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


参考:
阅读(2756) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~