将firstbook.xml
文件转换为我们需要的格式,如html或者pdf,需要相应的DocBook-xsl样式表及saxon和fop程序。
样式表目录DocBook-xsl-1.79.1
下有很多目录和文件,下面的表格列出了一些会常用的:
表 1.2. 样式表目录及作用
No. | 目录名 | 用途 |
---|---|---|
1 | fo | 将xml文件转换为fo文件,然后再将fo文件转换为pdf格式的文件 |
2 | html | 将xml文件转换为html文件 |
3 | epub | 将xml文件转换为epub(电子书)文件 |
4 | htmlhelp | 将xml文件转换为htmlhelp文件 |
5 | slides | 制作幻灯片(类似ppt)的样式表 |
转换为html文件比较简单,如果只是转换为可以在线阅读的文档,在样式方面没有特别需求的话,使用saxon,按照下面的命令执行就可以了:
将firstbook.xml
转换为单页html文件,使用DocBook-xsl-1.79.1/html/DocBook.xsl
文件,命令如下:
docware/jre-8u301-linux-x64/jre1.8.0_301/bin/java -cp \ docware/saxon6-5-5/saxon.jar:\ docware/DocBook-xsl-1.79.1/extensions/saxon65.jar:\ com.icl.saxon.StyleSheet -o firstbook.html firstbook.xml \ docware/DocBook-xsl-1.79.1/html/DocBook.xsl
命令执行结束,会生成firstbook.html
文件。
转换为多个html文件,使用DocBook-xsl-1.79.1/html/chunk.xsl文件,命令如下:
docware/jre-8u301-linux-x64/jre1.8.0_301/bin/java -cp \ docware/saxon6-5-5/saxon.jar:\ docware/DocBook-xsl-1.79.1/extensions/saxon65.jar:\ com.icl.saxon.StyleSheet firstbook.xml \ docware/DocBook-xsl-1.79.1/html/chunk.xsl
命令执行结束,会生成以index.html
为索引的一族html文件。
如果html文件适合在线浏览的话,那对于有打印需求的人来说,pdf可能是最好的选择。从xml转换到pdf可能要麻烦一点,需要先使用saxon将xml文件转换为fo文件,然后再使用fop将fo文件转换为pdf文件。为了能得到显示良好的pdf文件,在转换之前需要先做两件准备工作。一是配置fop.conf
文件,二是对针对fo的DocBook-xsl做适当的调整。
配置fop.conf的主要目的就是能让合适的字体加载到pdf文件中,如果找不到合适的字体,pdf文件可能会显示乱码。在目录fop-2.4-bin/fop/conf/
中,有一个fop.xconf
文件,将这份文件复制一份,并将复制后的文件重新命名为fop.conf
。并对这个文件做两处修改:
在<base>.</base>下添加一行,如下:
<base>.</base> <font-base>/usr/share/fonts</font-base>
这一行的意义是让fop可以到这个目录里去寻找字体。需要根据字体的具体目录来设定。
在<fonts></fonts>节点中添加如下的字体信息:
<auto-detect/> <font kerning="yes" embed-url="/usr/local/docware/fonts/SourceHanSerifCN-Regular.otf"> <font-triplet name="Source Han Serif CN" style="normal" weight="normal"/> </font> <font kerning="yes" embed-url="/usr/local/docware/fonts/SourceHanSansCN-Regular.otf"> <font-triplet name="Source Han Sans CN" style="normal" weight="normal"/> </font> <font kerning="yes" embed-url="/usr/local/docware/fonts/SourceHanMonoSC-Regular.otf"> <font-triplet name="Source Han Mono SC" style="normal" weight="normal"/> </font>
经过这样简单的配置,字体就在fop中配置好了。其中的auto-detect是自动检测系统中安装的字体。后面三个font节点配置的就是前面我们下载的三个字体。
fop详细的配置信息请参考:https://xmlgraphics.apache.org/fop/2.4/configuration.html
fop设置的另外一个工作,就是需要在fop-2.4-bin/fop/fop
脚本中添加classpath。
#! /bin/sh # # Licensed to the Apache Software Foundation (ASF) under one or more # ... # This script was modified by ChunXin <484299@qq.com> , <cx.lee@outlook.com>, 2021/09 DOCWARE_HOME="/usr/local/docware" JAVA_HOME="$DOCWARE_HOME/jre-8u301-linux-x64/jre1.8.0_301" FOP_HOME="$DOCWARE_HOME/fop-2.6-bin/fop" XSL_EXTENSIONS="$DOCWARE_HOME/docbook-xsl-1.79./extensions" CLASSPATH="$CLASSPATH:\ $FOP_HOME/build/fop.jar:\ $FOP_HOME/build/fop-hyph.jar:\ $FOP_HOME/lib/batik-all-1.14.jar:\ $FOP_HOME/lib/commons-io-1.3.1.jar:\ $FOP_HOME/lib/commons-logging-1.0.4.jar:\ $FOP_HOME/lib/fontbox-2.0.19.jar:\ $FOP_HOME/lib/serializer-2.7.2.jar:\ $FOP_HOME/lib/xalan-2.7.2.jar:\ $FOP_HOME/lib/xercesImpl-2.12.0.jar:\ $FOP_HOME/lib/xml-apis-1.4.01.jar:\ $FOP_HOME/lib/xml-apis-ext-1.3.04.jar:\ $FOP_HOME/lib/xmlgraphics-commons-2.6.jar" export JAVA_HOME FOP_HOME XSL_EXTENSIONS CLASSPATH
将上面的这段代码加在fop-2.4-bin/fop/fop
的前面。
关于样式表参数的调整,主要是调整DocBook-xsl-1.79.1/fo/param.xsl
里的一些内容
1 <xsl:param name="l10n.gentext.default.language">zh_cn</xsl:param> 2 <xsl:param name="l10n.gentext.language">zh_cn</xsl:param> 3 4 <xsl:param name="paper.type">A4</xsl:param> 5 6 <xsl:param name="body.font.family">Source Han Serif CN,serif</xsl:param> 7 <xsl:param name="title.font.family">Source Han Sans CN,sans</xsl:param> 8 <xsl:param name="monospace.font.family">Source Han Mono SC,monospace</xsl:param> 9 10 <xsl:param name="line-height">1.7</xsl:param>
上面的这段代码主要是对语言、版面大小、字体和行间距进行了调整。
fop.conf
和样式表配置好以后,就可以生成pdf格式的文件了。分为两步:
第一步首先是要生成fo文件,与生成单页html文件类似,使用saxon,只需要把样式表html/DocBook.xsl
更换为fo/DocBook.xsl
:
docware/jre-8u301-linux-x64/jre1.8.0_301/bin/java -cp \ docware/saxon6-5-5/saxon.jar:\ docware/DocBook-xsl-1.79.1/extensions/saxon65.jar:\ com.icl.saxon.StyleSheet -o firstbook.fo firstbook.xml \ docware/DocBook-xsl-1.79.1/fo/DocBook.xsl
然后使用fop程序将fo文件转换为pdf文件:
fop-2.4-bin/fop/fop firstbook.fo firstbook.pdf -c fop-2.4-bin/fop/conf/fop.conf