DITA-OT是DITA Open Toolkit的缩写,它是一个开源发布引擎,用于将DITA格式的内容发布成不同格式的输出,比如:HTML、PDF等。
有些结构化编辑系统(如:Oxygen XML Editor)已经集成了DITA-OT。如果选择DITA来编写结构化内容,那么你很有可能已经通过DITA-OT进行内容发布了。
下边我们一起来看看DITA-OT是怎样工作的。
- 1 -
DITA-OT发布PDF的过程
以下是使用DITA-OT发布PDF的命令:
dita -i cloudphoto.ditamap -f pdf -o pdfout
它的意思是:
-
输入文件为cloudphoto.ditamap文件;
-
输出格式是pdf;
-
输出结果放到pdfout目录中。
运行这个命令,后台发生什么事情呢?下边我们一起来看一下。
DITA-OT支持发布多种格式的输出,主要分为PDF和基于HTML的输出两类。下图中,蓝色路径是运行发布PDF命令后走过的步骤。
1. 通用预处理
不论发布的类型是什么,DITA-OT发布首先运行的是预处理程序。它主要是为后续的步骤做准备工作。根据DITA-OT的文档,预处理包括:生成列表、处理引用、内容过滤、移动元数据等17个模块,详情请见DITA-OT文档:
https://www.dita-ot.org/dev/reference/preprocessing.html
2. 合并Topic
DITA数据包通常由一个ditamap和多个topic文件组成。为了方便处理,DITA-OT将这些内容合并到一个XML文件中。
3. 将XML转换成XSL-FO
XSLT是一个数据转换的语言,由XSLT引擎执行。它通过读取XML文件,应用数据处理逻辑,然后生成XSL-FO文件。
4. 将XSL-FO转换成PDF
XSL-FO是W3C的标准之一,用于XML文档的布局和打印。要将XSL-FO生成PDF,需要用到FO引擎。
DITA-OT目前支持三个引擎,他们分别是:
-
FOP - 开源的FO引擎,已经包含在DITA-OT中;
-
Antenna House - 商业FO引擎,DITA-OT可以使用它发布PDF,但需要单独购买和安装;
-
RenderX - 商业FO引擎,DITA-OT使用它发布PDF,也需要单独购买和安装。
- 2 -
中文支持
DITA-OT的实现了支持多语言处理,但默认只对西方文字有较好的处理。下边我们来看一看DITA-OT支持中文的细节。
1. 将内容标识成中文
在“将XML转换成XSL-FO”这个步骤中,样式会自动生成一些文字,比如:目录最上边的“目录”二字。 我们把这种样式表生成的文字叫做“生成文字” (Gentext)。
Gentext没有放在DITA文件中,而是放在样式文件中,内容编辑人员无法直接控制或者更改它。
DITA中,默认的语言是英语,如果不做设置,Gentext默认是英文的。所以目录这个地方,默认是看到"Contents",如下图红色方框所示。
如果要让它显示中文,我们需要在ditamap文件中标识DITA内容的语言为中文。如下图:
xml:lang属性表示内容的语言,zh-CN代表中文。
这样,发布的时候Gentext就会显示中文了。
2. 为FOP安装中文字体
DITA-OT默认带的FO引擎是FOP,FOP能够使用操作系统带的字体。对于中文,它默认使用宋体。但是这个字体没有粗体,所以会出现粗体不显示的现象。
如果对默认的字体不满意,一种解决方案就是安装其他的字体,比如:阿里巴巴普惠体。
首先,可以从这里免费下载阿里巴巴普惠体:
https://alibabafont.taobao.com/
然后,将字体文件解压并放到以下目录中:
{DITA-OT_HOME}\plugins\org.dita.pdf2.fop\cfg\fonts\
这样就为FOP安装好阿里巴巴普惠体了。
3. 设置DITA-OT中的字体映射
除了为FOP安装中文字体,还需要在DITA-OT中设置字体映射才能在PDF输出中正确使用字体显示中文。
DITA-OT的样式表中,没有直接使用最终物理字体的名字,而是使用一个逻辑字体。根据映射的配置,逻辑字体最终被翻译成最终的物理字体。 这种设计的好处是可以根据需要来配置最终的字体,但又不用修改样式表的代码。
DITA-OT的字体映射文件放在了这里:
{DITA-OT_HOME}\dita-ot-3.7\plugins\org.dita.pdf2\cfg\fo\font-mappings.xml
内容如下:
<?xml version="1.0"?>
<font-mappings>
<font-table>
<aliases>
<alias name="serif">Serif</alias>
</aliases>
<aliases>
<alias name="sans-serif">Sans</alias>
</aliases>
<aliases>
<alias name="monospace">Monospaced</alias>
</aliases>
<aliases>
<alias name="Helvetica">Normal</alias>
</aliases>
<aliases>
<alias name="Courier">Monospaced</alias>
</aliases>
<logical-font name="Sans">
<physical-font char-set="default">
<font-face>Helvetica, Arial Unicode MS, Tahoma, Batang, SimSun</font-face>
</physical-font>
<physical-font char-set="Simplified Chinese">
<font-face>AdobeSongStd-Light, Arial Unicode MS, Batang, SimSun</font-face>
</physical-font>
<physical-font char-set="Japanese">
<font-face>MS-Gothic, Hiragino Kaku Gothic Pro, HiraKakuProN-W3, YuGothic, Arial Unicode MS</font-face>
</physical-font>
<physical-font char-set="Korean">
<font-face>AdobeMyungjoStd-Medium, Arial Unicode MS, Batang</font-face>
</physical-font>
<physical-font char-set="Symbols">
<font-face>ZapfDingbats</font-face>
</physical-font>
<physical-font char-set="SubmenuSymbol">
<font-face>ZapfDingbats</font-face>
</physical-font>
<physical-font char-set="SymbolsSuperscript">
<font-face>Helvetica, Arial Unicode MS</font-face>
<baseline-shift>20%</baseline-shift>
<override-size>smaller</override-size>
</physical-font>
</logical-font>
<logical-font name="Serif">
<physical-font char-set="default">
<font-face>Times New Roman, Times, Arial Unicode MS, Tahoma, Batang, SimSun</font-face>
</physical-font>
<physical-font char-set="Simplified Chinese">
<font-face>AdobeSongStd-Light, Arial Unicode MS, Batang, SimSun</font-face>
</physical-font>
<physical-font char-set="Japanese">
<font-face>MS-Mincho, Hiragino Mincho Pro, HiraMinProN-W3, YuMincho, Arial Unicode MS</font-face>
</physical-font>
<physical-font char-set="Korean">
<font-face>AdobeMyungjoStd-Medium, Arial Unicode MS, Batang</font-face>
</physical-font>
<physical-font char-set="Symbols">
<font-face>ZapfDingbats</font-face>
</physical-font>
<physical-font char-set="SubmenuSymbol">
<font-face>ZapfDingbats</font-face>
</physical-font>
<physical-font char-set="SymbolsSuperscript">
<font-face>Times New Roman, Times, Arial Unicode MS, Tahoma, Batang</font-face>
<baseline-shift>20%</baseline-shift>
<override-size>smaller</override-size>
</physical-font>
</logical-font>
<logical-font name="Monospaced">
<physical-font char-set="default">
<font-face>Courier New, Courier, Arial Unicode MS, Tahoma, Batang, SimSun</font-face>
</physical-font>
<physical-font char-set="Simplified Chinese">
<font-face>AdobeSongStd-Light, Arial Unicode MS, Batang, SimSun</font-face>
</physical-font>
<physical-font char-set="Japanese">
<font-face>MS-Gothic, Hiragino Kaku Gothic Pro, HiraKakuProN-W3, YuGothic, Arial Unicode MS</font-face>
</physical-font>
<physical-font char-set="Korean">
<font-face>AdobeMyungjoStd-Medium, Arial Unicode MS, Batang</font-face>
</physical-font>
<physical-font char-set="Symbols">
<font-face>ZapfDingbats</font-face>
</physical-font>
<physical-font char-set="SymbolsSuperscript">
<font-face>Courier New, Courier, Arial Unicode MS, Tahoma, Batang</font-face>
<baseline-shift>20%</baseline-shift>
<override-size>smaller</override-size>
</physical-font>
</logical-font>
</font-table>
</font-mappings>
对于逻辑字体Serif(看46行),如果是中文,映射的物理字体是:AdobeSongStd-Light, Arial Unicode MS, Batang, SimSun。(看50行)
下边,将阿里巴巴普惠体配置到文件中:
<logical-font name="Serif">
...
<physical-font char-set="Simplified Chinese">
<font-face>
Alibaba PuHuiTi, AdobeSongStd-Light, Arial Unicode MS, Batang, SimSun
</font-face>
</physical-font>
...
</logical-font>
<logical-font name="Monospaced">
...
<physical-font char-set="Simplified Chinese">
<font-face>
Alibaba PuHuiTi, AdobeSongStd-Light, Arial Unicode MS, Batang, SimSun
</font-face>
</physical-font>
...
</logical-font>
<logical-font name="Serif">
...
<physical-font char-set="Simplified Chinese">
<font-face>
Alibaba PuHuiTi, AdobeSongStd-Light, Arial Unicode MS, Batang, SimSun
</font-face>
</physical-font>
...
</logical-font>
(分别在3个逻辑字体的中文情况下,加入Alibaba PuHuiTi)
通过以上配置,DITA-OT就能使用阿里巴巴普惠体来显示中文了。
- 3 -
小结
在DITA-OT中支持中文字体,包括以下3个步骤:
-
将内容标识成中文;
-
安装中文字体;
-
配置字体映射。
- 4 -
术语
XSLT
XSLT 是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言。
参考:
https://www.w3school.com.cn/xsl/index.asp
XSL-FO
XSL-FO 指可扩展样式表语言格式化对象(Extensible Stylesheet Language Formatting Objects),是用于格式化 XML 数据的语言。
参考:
https://www.runoob.com/xslfo/xslfo-tutorial.html