注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学会珍惜

You've been saying for the longest time

 
 
 

日志

 
 

如何用docbook生成中文pdf  

2012-10-26 18:39:53|  分类: 持续集成 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

转自:四方国件之JEE应用服务器    

前提假设

读者已经可以用xalanfop生成英文版本的pdf

用到工具

0.ant用来build

1.xml格式转换文件xalan-j_2_7_0

2.生成pdffop-0.95

3.样式文件docbook-xsl-ns-1.75.2

step by step

step 1 找到中文字体

默认情况下,pdf中的中文字会被替换为字符#

step1.1 注册中文字体文件

fop中的TTFReader工具生成字体文件,以下代码可供参考(生成黑体字和宋体字的simhei.xmlsimsun.xml):

set TTFReader=java -cp ..\build\fop.jar;..\lib\avalon-framework-4.2.0.jar;..\lib\batik-all-1.7.jar;..\lib\commons-logging-1.0.4.jar;..\lib\commons-io-1.3.1.jar;..\lib\serializer-2.7.0.jar;..\lib\xalan-2.7.0.jar;..\lib\xercesImpl-2.7.1.jar;..\lib\xml-apis-1.3.04.jar;..\lib\xml-apis-ext-1.3.04.jar;..\lib\xmlgraphics-commons-1.3.1.jar org.apache.fop.fonts.apps.TTFReader   %TTFReader% C:\WINDOWS\Fonts\simhei.ttf %cd%\simhei.xml %TTFReader% -ttcname "SimSun" C:\WINDOWS\Fonts\simsun.ttc %cd%\simsun.xml 

step1.2 配置中文字体

a) fop-0.95/conf目录下新建fop.zh-CN.conf文件,内容复制自同目录下的fop.xconf。在fonts标签中加入如下代码

<fonts>

  <font metrics-url="file:///..\..\conf\lib\fop-0.95\conf\simhei.xml" kerning="yes" embed-url="file:///c:\windows\fonts\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>

  <font metrics-url="file:///..\..\conf\lib\fop-0.95\conf\simsun.xml" kerning="yes" embed-url="file:///c:\windows\fonts\simsun.ttc">

    <font-triplet name="simsun" style="normal" weight="normal" />

    <font-triplet name="simsun" style="normal" weight="bold" />

    <font-triplet name="simsun" style="italic" weight="normal" />

    <font-triplet name="simsun" style="italic" weight="bold" />

  </font>

</fonts>

其中metrics-url指出了字体注册文件xml的位置,embed-url则是ttf或ttc字体文件的实际位置。上例中的值仅供参考。

b)修改fop命令的参数文件为fop.zh-CN.conf文件,例如:

 userconfig="${conf.dir}/fop.zh-CN.conf" 

step2 嵌入中文字体

假设docbook的源文件为index.xml,那么转化为pdf其实是两个步骤:

1.index.xml->index.fo,由xalan生成带有样式标签的中间文件index.fo

2.index.fo->index.pdf, 由fop将fo文件转化为最终的pdf

step2.1 index.xml->index.fo

a)在docbook-xsl-ns-1.75.2/fo下新建样式表docbook.zh-CN.xsl,内容为:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" 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">simsun</xsl:param>
<xsl:param name="body.font.size">12</xsl:param>
<xsl:param name="monospace.font.family">simsun</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">true</xsl:param>
<xsl:param name="paper.type" select="'A4'" />
<xsl:param name="draft.mode" select="'no'" />
<xsl:param name="fop1.extensions" select="1" />
</xsl:stylesheet>

b)修改xalan的stylesheet文件为docbook.zh-CN.xsl,例如: 
<property name="fo.stylesheet" value="${docbook.xsl.dir}/fo/docbook.zh-CN.xsl" /> 

step2.2 index.fo->index.pdf

执行fop命令,指定fo文件,指定basedir(影响index.xml中图片等文件的嵌入链接),配置文件以及输出目录等。例如:

<fop format="application/pdf" userconfig="${conf.dir}/fop.zh-CN.conf" fofile="${fo.dir}/index.fo" basedir="${fo.dir}/" outfile="${doc.dir}/index.pdf" /> 

到此基本完成了中文输出的问题,但是仍有很多细小的问题需要调整。

step 3 解决常见问题

1.空格的注意事项:尽量不要在段落文本中出现不必要的空格,可能会导致格式的问题。出现pdf段落中莫名其名长空白的,只需要删除xml源文件中对应位置的空格基本上可以解决这一问题。

2.生成pdf的命令集成到eclipse ant 中。

2.1在build.xml中重修改原属性设置为:<property name="fo.stylesheet" value="${docbook.xsl.dir}/fo/docbook.zh-CN.xsl" />启用新样式文件docbook.zh-CN.xsl

2.2在build.xml中的fop命令中添加userconfig="${conf.dir}/fop.zh-CN.conf"启用新配置文件fop.zh-CN.conf

2.3在build.xml中修改和添加属性 <property name="fop.home" value="../conf/lib/fop-0.95" />和<property name="conf.dir" value="../conf/lib/fop-0.95/conf" />启动新fop 0.95版本。

3.列表的问题解决,在解决中文目录的问题时一同解决的,因为它的相关配置也在common目录下zh_cn.xml中。

4.表格还有少许格式问题,内容越界这样的问题。不像html会自动调整,需要具体自己仔细调整,是体力活。

5.图片的问题需要统一修改.另外图片大小的问题还没有解决。

5.1因为pdf格式的转换工具和html、fo格式转换工具的默认根路径不同。需要修改build.xml为fop命令加参数basedir="${fo.dir}/"

5.2图片缩放的参数为scale='50'表示为原图的50%大

6.粗体、斜体字的问题还没有解决

7.中文目录的问题

7.1修改源文件<book lang="zh">

7.2docbook-xsl-ns-1.75.2的common目录下l10n.xml中<!ENTITY zh_cn SYSTEM "zh_cn.xml">和&zh_cn中的zh_cn改为zh

7.3docbook-xsl-ns-1.75.2的common目录下zh_cn.xml中第二行改为<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="zh" english-language-name="Chinese Simplified">

8.pdf书签的问题:只需要在xsl样式文件docbook.zh-CN.xsl中加<xsl:param name="fop1.extensions" select="1"/>

9.字体用黑体和宋体。字体文件已上传,相对路径也已经修改。粗体的问题还没有解决。

9.1关于粗体的问题的说明:

一般来说,粗体和斜体需要专门的字体库,而不是根据算法来做的(ms的word之类除外)。所以宋体的粗体应该用黑体来对应,但目前还没有成功改好。

参考文献

关于图片和表格: http://infohost.nmt.edu/tcc/help/pubs/docbref/docbref.pdf

 http://www.sagehill.net/docbookxsl/FormalTitles.html

关于ant与fop: http://xmlgraphics.apache.org/fop/0.95/anttask.html

关于fop转换中文pdf: http://easwy.com/blog/archives/fop-errors-and-solution

 http://www.newsmth.net/pc/pccon.php?id=198&nid=14499

中文字体fop注册: http://www.cnblogs.com/sunsonbaby/archive/2004/12/18/78768.html

 http://www.pgsqldb.org/mwiki/index.php/Asciidoc

 http://www.simon-cozens.org/content/docbook-fop-fonts-and-multilingua

中文样式表: http://blog.donews.com/limodou/archive/2004/04/01/9917.aspx

Fop 0.95的docs

 http://onjava.com/pub/a/onjava/2002/10/16/fop.Html

 http://xmlgraphics.apache.org/fop/0.95/fonts.html

 http://www.cnblogs.com/linlu11

  评论这张
 
阅读(655)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017