3. 生成我们需要的文件

firstbook.xml文件转换为我们需要的格式,如html或者pdf,需要相应的DocBook-xsl样式表及saxon和fop程序。

样式表目录DocBook-xsl-1.79.1下有很多目录和文件,下面的表格列出了一些会常用的:

表 1.2. 样式表目录及作用

No.目录名用途
1fo将xml文件转换为fo文件,然后再将fo文件转换为pdf格式的文件
2html将xml文件转换为html文件
3epub将xml文件转换为epub(电子书)文件
4htmlhelp将xml文件转换为htmlhelp文件
5slides制作幻灯片(类似ppt)的样式表

3.1. 转换为html文件

转换为html文件比较简单,如果只是转换为可以在线阅读的文档,在样式方面没有特别需求的话,使用saxon,按照下面的命令执行就可以了:

  1. 转换为单页html

    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文件。

  2. 转换为多页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文件。

3.2. 转换为pdf文件

如果html文件适合在线浏览的话,那对于有打印需求的人来说,pdf可能是最好的选择。从xml转换到pdf可能要麻烦一点,需要先使用saxon将xml文件转换为fo文件,然后再使用fop将fo文件转换为pdf文件。为了能得到显示良好的pdf文件,在转换之前需要先做两件准备工作。一是配置fop.conf文件,二是对针对fo的DocBook-xsl做适当的调整。

3.2.1. 配置fop.conf文件

配置fop.conf的主要目的就是能让合适的字体加载到pdf文件中,如果找不到合适的字体,pdf文件可能会显示乱码。在目录fop-2.4-bin/fop/conf/中,有一个fop.xconf文件,将这份文件复制一份,并将复制后的文件重新命名为fop.conf。并对这个文件做两处修改:

  1. 在<base>.</base>下添加一行,如下:

    <base>.</base>
    <font-base>/usr/share/fonts</font-base>

    这一行的意义是让fop可以到这个目录里去寻找字体。需要根据字体的具体目录来设定。

  2. 在<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

3.2.2. 设置fop脚本

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的前面。

3.2.3. DocBook-xsl参数调整

关于样式表参数的调整,主要是调整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>

上面的这段代码主要是对语言、版面大小、字体和行间距进行了调整。

3.2.4. 生成pdf文件

fop.conf和样式表配置好以后,就可以生成pdf格式的文件了。分为两步:

  1. 生成fo文件

    第一步首先是要生成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
  2. 将fo文件转换为pdf

    然后使用fop程序将fo文件转换为pdf文件:

    fop-2.4-bin/fop/fop firstbook.fo firstbook.pdf -c fop-2.4-bin/fop/conf/fop.conf