Transition Docbook

版本0.1

本文档采用docBook-xml-4.2标准书写,使用saxon6.5.3输出html和fo,用fop0.20.5把fo转换成pdf。

刚开始用docbook写文档觉得非常的不适应,毕竟比起用所见即所得的编辑工具来,要费事很多,其中文档的转换我就很费周折, 最终通过查阅网上资料得以解决,希望本文能给正在为转换docbook文档而困扰的人以帮助。

开始本文之前给出网上两篇文章的链接:limodou写的<<docbook学习>>, 是我学习docbook入门的文章;曹晓纲写的<<Add Asia fonts to docbook-fop , Hibernate style>>指导我转换docbook文档。


目录

概述 1. saxon-fop
1.1. 下载工具 1.2. 搭建环境
2. xsltproc

概述

虽然在刚开始写docbook文档的时候会有些不适,但是当看到规范清晰的文档时,我相信此刻会填补你 所有的不满与牢骚。动手写过几篇文章后就会习惯docbook的语法规则,其实docbook常用的元素也不是 很多。

docbook文档有sgml、xml、两种格式,转换文档样式也有相对应的两种格式dsssl、xsl 本人用的是遵循docbook-xml-dtd规则的xml文档格式。sgml也是一种标识语言,早于 xml.

通过转换工具解析docbook文档和转换样式,就可以生成规范、多样的文档。如html形式,pdf、rtf、chm javadoc等格式。 本人使用过的转换工具xsltproc、saxon、fop,随后将描述其使用方法。

第 1 章 saxon-fop

1.1. 下载工具

下载转换工具时请注意对照版本号,笔者在使用中发现有些版本有bug。

  • docbook-dtd-4.2

  • docbook-xsl-1.65.1

  • saxon6.5.3

  • fop0.20.5

  • pdf中插入图片时需用到JAVA ADVANCED IMAGING PLUG-INS, VERSION 1.0中的jar包。

  • 转换中文文档需要用到字体文件simsun.ttc和simhei.ttf,中文操作系统在%system%/fonts/ 下能找到

1.2. 搭建环境

建立目录如下(引用hibernate中文手册目录结构):
|---docbook
+---suport
+---lib          (1)
+---docbook-dtd
+---docbook-xsl
+---zh-cn           (2)
+---images
+---styles
+---fop
+---modules
|---master.xml
|---build.xml       (3)
(1)

放置转换工具组件。

(2)

将文档所用的图片放置到images,转换样式及css放置styles文件夹中,fop文件中放置转换fop的所需 的字体文件。待转换的docbook源文件放置在modules文件夹中,master.xml文件为docbook文档的起始文件。

(3)

ant的构建文件。

1、将下载工具中*.jar文件拷贝到lib

2、利用fop0.20.5生成中文pdf文件时,请做以下操作(摘自曹晓纲“docbook + TTF + FOP 编写中文”)

fop默认没有支持中文字体。解决办法是从windows的TTF字体中提取fontmatrix文件.
java-cpD:/works/hibernate2/doc/reference/support/lib/fop.jar;D:/works/hibernate2/doc/
reference/support/lib/avalon-framework-cvs-20020806.jar org.apache.fop.fonts.apps.TTFReader
C:/Windows/Fonts/simhei.ttf simhei.xml
java -cp D:/works/hibernate2/doc/reference/support/lib/fop.jar;D:/works/hibernate2/doc/reference
/support/lib/avalon-framework-cvs-20020806.jar org.apache.fop.fonts.apps.TTFReader -ttcname
"SimSun" C:/Windows/Fonts/simsun.ttc simsun.xml
得到两个xml文件:simsun.xml, sumhei.xml;然后在userconfig.xml中注册:
<fonts>
<font metrics-file="simhei.xml" embed-file="file:///c:/windows/fonts/simhei.ttf" kerning="yes">
<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-file="simsun.xml" embed-file="file:///c:/windows/fonts/simsun.ttc" kerning="yes">
<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>
ok,字体的问题即可解决
生成的pdf文件的中文每一行都很长,没有断开。在limodou的blog中曾经提到,如果把docbook的zh-cn强制改为zh,
并且做两个假的zh.xml文件即可解决这个问题。显然这是fop的一个bug.fop源代码:
org.apache.fop.layout.LineArea.java 第1407行:
String lang = hyphProps.language.toLowerCase();
if ("zh".equals(lang) || "ja".equals(lang) || "ko".equals(lang)
|| "vi".equals(lang))
ret = true;
显然问题就出在这里。作者想当然的编写了一些需要断字的case,却没有遵守RFC 3066规范。
修改为:
if (lang.startsWith("zh" || lang.startsWith("ja" || lang.startsWith("ko"
|| lang.startsWith("vi")
ret = true;
重新编译fop. 搞定。

3、建立ant的构建文件。

ant是一个非常好用的构建工具,使用和配置都很简单,这里不再对ant进行描述。本文引用hibernate汉化 工作组的build.xml文档

例 1.1. build.xml

<project name="HibernateDocumentation" default="all.doc" basedir=".">
<!-- Set build directories for all formats. -->
<property name="build.dir"             value="${basedir}/build"/>
<!-- Support files for build process. -->
<property name="support.dir"           value="${basedir}/support"/>
<!-- Set DocBook stylesheets. -->
<property name="db.style.fopdf"        value="fopdf.xsl"/>
<property name="db.style.html"         value="html_chunk.xsl"/>
<property name="db.style.htmlsingle"   value="html.xsl"/>
<!-- Classpath for the build tools. -->
<path id="lib.classpath">
<fileset dir="${support.dir}/lib">
<include name="**/*.jar"/>
</fileset>
</path>
<!-- ################################################################## -->
<target name="all.doc"
depends="clean"
description="Compile documentation for all languages and all formats.">
<!-- TRANSLATOR: Duplicate this line for your language -->
<!--<antcall target="lang.all"><param name="lang" value="en"/></antcall>-->
<antcall target="lang.all"><param name="lang" value="zh-cn"/></antcall>
</target>
<target name="all.revdiff"
description="Generates a diff report for all translated versions.">
<!-- TRANSLATOR: Duplicate this line for your language -->
<antcall target="lang.revdiff"><param name="lang" value="de"/></antcall>
</target>
<!-- ################################################################## -->
<target name="clean">
<!-- Delete build directory. -->
<delete dir="${build.dir}"/>
</target>
<target name="lang.all">
<!-- Compile the documentation for a single language in all formats. -->
<antcall target="lang.docpdf"/>
<antcall target="lang.dochtml"/>
<antcall target="lang.dochtmlsingle"/>
<antcall target="lang.htmlmisc"/>
</target>
<target name="lang.docpdf.prepare">
<!-- Copy all the images to the output location, will be removed later. -->
<copy todir="${build.dir}/${lang}/pdf/images">
<fileset dir="${basedir}/${lang}/images">
<include name="**/*.png"/>
<include name="**/*.svg"/>
<include name="**/*.gif"/>
</fileset>
</copy>
<!-- Create the XSL/FO temporary file. -->
<java classname="com.icl.saxon.StyleSheet" fork="true" dir="${basedir}">
<classpath refid="lib.classpath"/>
<arg value="-o"/>
<arg value="${build.dir}/${lang}/pdf/docbook_fop.fo"/>
<arg value="${basedir}/${lang}/master.xml"/>
<arg value="${basedir}/${lang}/styles/${db.style.fopdf}"/>
</java>
<available property="custom.fop.userconfig.present" file="userconfig.xml"
filepath="${basedir}/${lang}/fop"/>
</target>
<target name="lang.docpdf.customized" depends="lang.docpdf.prepare" if="custom.fop.userconfig.present">
<copy todir="${build.dir}/${lang}/pdf">
<fileset dir="${basedir}/${lang}/fop">
<include name="*"/>
</fileset>
</copy>
<!-- Create a PDF from the XSL/FO, using customized fop userconfig.xml -->
<java classname="org.apache.fop.apps.Fop" fork="true" dir="${basedir}">
<classpath refid="lib.classpath"/>
<arg value="-c"/>
<arg value="${basedir}/${lang}/fop/userconfig.xml"/>
<arg value="${build.dir}/${lang}/pdf/docbook_fop.fo"/>
<arg value="${build.dir}/${lang}/pdf/hibernate_reference.pdf"/>
</java>
</target>
<target name="lang.docpdf.normal" depends="lang.docpdf.prepare" unless="custom.fop.userconfig.present">
<!-- Create a PDF from the XSL/FO. -->
<java classname="org.apache.fop.apps.Fop" fork="true" dir="${basedir}">
<classpath refid="lib.classpath"/>
<arg value="${build.dir}/${lang}/pdf/docbook_fop.fo"/>
<arg value="${build.dir}/${lang}/pdf/hibernate_reference.pdf"/>
</java>
</target>
<!--<target name="lang.docpdf" depends="lang.docpdf.normal,lang.docpdf.customfop">-->
<target name="lang.docpdf" depends="lang.docpdf.normal,lang.docpdf.customized">
<!-- House keeping,delete temporary files. -->
<!--
<delete file="${build.dir}/${lang}/pdf/docbook_fop.txt"/>
<delete  dir="${build.dir}/${lang}/pdf/images"/>
<delete>
<fileset dir="${build.dir}/${lang}/pdf" includes="**/*.xml"/>
</delete>
-->
</target>
<target name="lang.dochtml">
<mkdir dir="${build.dir}/${lang}/html/"/>
<java classname="com.icl.saxon.StyleSheet" fork="true" dir="${build.dir}/${lang}/html">
<classpath refid="lib.classpath"/>
<arg value="${basedir}/${lang}/master.xml"/>
<arg value="${basedir}/${lang}/styles/${db.style.html}"/>
</java>
</target>
<target name="lang.dochtmlsingle">
<mkdir dir="${build.dir}/${lang}/html_single/"/>
<java classname="com.icl.saxon.StyleSheet" fork="true" dir="${basedir}">
<classpath refid="lib.classpath"/>
<arg value="-o"/>
<arg value="${build.dir}/${lang}/html_single/index.html"/>
<arg value="${basedir}/${lang}/master.xml"/>
<arg value="${basedir}/${lang}/styles/${db.style.htmlsingle}"/>
</java>
</target>
<target name="lang.htmlmisc">
<!-- Copy images and CSS for HTML documentation, language specific. -->
<copy todir="${build.dir}/${lang}/shared/images">
<fileset dir="${basedir}/${lang}/images">
<include name="**/*.png"/>
<include name="**/*.gif"/>
</fileset>
</copy>
<copy todir="${build.dir}/${lang}/shared/css">
<fileset dir="${basedir}/${lang}/styles">
<include name="**/*.css"/>
</fileset>
</copy>
</target>
<target name="lang.revdiff">
<taskdef name="revdiff"
classname="org.hibernate.docproc.revdiff.RevDiffReportTask"
classpathref="lib.classpath">
</taskdef>
<revdiff original="${basedir}/en/master.xml"
copy="${basedir}/${lang}/master.xml"
report="${build.dir}/status_${lang}.html"/>
</target>
</project>

通过上述配置之后,进入该目录运行ant,转换的文档将会放置build目录下,在转换之前请验证xml的正确性。

第 2 章 xsltproc

xsltproc有c和java两种语言的版本。本文描述的是c语言版本的。下载xlstproc。

1、建立如下目录

|---docbook
+---bin           (1)
+---lib           (2)
+---source
+---docbook-dtd
+---docbook-xsl
(1) 将xsltproc中*.exe文件放置该文件夹下。
(2) 将xsltproc中所有lib下的文件放置该文件夹下。

2、将bin和lib实际路径设置到系统环境path路径。

以下是xsltproc常用的转换命令

--生成rtf文件
xsltproc 转换样式文件.xsl 待转换文件.xml > 输出文件.rtf
例:xsltproc C:/share/style/docbook-xsl-1.65.1/html/docbook.xsl c:/share/demo1.xml > c:/share/demo3.rtf
--生成html文件(分页文件)
xsltproc -o 输出目录 转换样式文件.xsl 待转换文件.xml
例:xsltproc -o c:/share/src/ C:/share/style/docbook-xsl-1.65.1/html/chunk.xsl c:/share/demo1.xml
--生成html文件(单页文件)
xsltproc -o 输出文件.html  转换样式文件.xsl  待转换文件.xml
例:xsltproc -o c:/share/src/demo11.html C:/share/style/docbook-xsl-1.65.1/html/docbook.xsl c:/share
/demo1.xml
--生成htmlHelp文件
xsltproc -o 输出目录  转换样式文件.xsl  待转换文件.xml
例:xsltproc -o c:/share/src/ C:/share/style/docbook-xsl-1.65.1/htmlhelp/htmlhelp.xsl c:/share/demo1.xml
--生成javaHelp文件
xsltproc -o 输出目录  转换样式文件.xsl  待转换文件.xml
例:xsltproc -o c:/share/src/ C:/share/style/docbook-xsl-1.65.1/javahelp/javahelp.xsl c:/share/demo1.xml
--生成xml文件
xsltproc -o 输出文件.xml  转换样式文件.xsl  待转换文件.xml
例: xsltproc -o c:/share/src/demo1_xml.xml C:/share/style/docbook-xsl-1.65.1/Xhtml/docbook.xsl c:/share
/demo1.xml
--生成fo文件
xsltproc xsltproc 转换样式文件.xsl 待转换文件.xml > 输出文件.fo
xsltproc C:/share/style/docbook-xsl-1.65.1/fo/fop.xsl c:/share/demo1.xml > c:/share/my.fo

Transition Docbook相关推荐

  1. css3之transition、transform、animation比较

    css3动画多少都有些了解,但是对于transition.transform.animation这几个属性一直是比较模糊的,所以啊,这里做一个总结,也希望大家都可以对此有一个更好地理解.    其实, ...

  2. transition属性值

    一.transition-property: transition-property是用来指定当元素其中一个属性改变时执行transition效果,其主要有以下几个值:none(没有属性改变):all ...

  3. animation与transition区别

    transition: 过渡属性 过渡所需要时间 过渡动画函数 过渡延迟时间:默认值分别为:all 0 ease 0 1.局限性: 1)只能设置一个属性 2)需要伪类/事件触发才执行 3)只能设置动画 ...

  4. vue transition动画

    引用: https://www.cnblogs.com/ccyinghua/p/7872694.html https://blog.csdn.net/wxw20147854/article/detai ...

  5. CSS3 过渡(Transition)

    过渡 transition 复合属性,使CSS属性值在不使用 Flash 动画或 JavaScript 的情况下,当元素从一种样式变换为另一种样式时为元素添加效果 取值: <'transitio ...

  6. css笔记 - transition学习笔记(二)

    开始把7,8月份学的css整理一下 transition过渡 1. CSS transition transition过渡 :用于当元素 从一种样式变换为另一种样式 时为元素添加效果. 2. tran ...

  7. CSS transition delay简介与进阶应用

    背景 在日常的项目开发中,我们会很经常的遇见如下的需求: 在浏览器页面中,当鼠标移动到某个部分后,另一个部分在延迟若干时间后出现 在鼠标移除该区域后,另一部分也在延迟若干时间后消失 我相信这是一个很常 ...

  8. transition标签_图解直到今天也没什么人知道的原生dialog标签(非常详细)

    在html5中,新增了很多语义化的标签.如footer.header之类的,今天的主角是dialog标签?顾名思义,就是用来定义对话框的.目前只有Chrome和Safari支持该标签,所以用的不多,不 ...

  9. CSS3与动画有关的属性transition、animation、transform对比

    最近应公司需求,需要用css3做动画,终于把以前一直傻傻分不清楚的三个属性理解了. 索性在这里进行一个简单的对比,加深自己的记忆. 浏览器兼容性 CSS3 transform 属性 Internet ...

最新文章

  1. 图解:人性的7种兵器(互联网商业逻辑)
  2. How to track an installation through client log-fi
  3. 有可能在onPause之前调用onSaveInstanceState
  4. python __init__ 构造函数
  5. 使用Java编写简单的老虎机游戏
  6. 转载-glance的用法
  7. MySQL最基础的操作
  8. Android 学习--ListView 的使用(一)
  9. log4j.properties文件示例
  10. 62. Event shiftKey 事件属性
  11. 父类子类的创建对象和实例化
  12. Android分区查看方法
  13. java生成zipf分布_数据存储中Zipf分布
  14. 南海滩饮食法——不饿的情况下快速减肥的法宝
  15. Netbox 开源 IPAM 管理工具搭建详细流程
  16. 阿里云部署SVN服务器
  17. 阿里云短信服务(申请与代码)
  18. 前台js MD5加密 后台 java MD5解密
  19. 脑洞文之去火星搞IT!
  20. 企业级大数据项目【1】需求分析及概要设计篇

热门文章

  1. 浅谈大型互联网企业入侵检测及防护策略
  2. steam_api64.dll丢失的解决方法
  3. mysql在线主从复制_使用MySQL8.0 clone技术在线搭建主从复制
  4. 刘慈欣回应《流浪地球》热点问题:承认有些设定有bug
  5. SQL判断字段中是否存在数字、汉字、字母、英文
  6. 服务器1u2u性能,服务器1u2u区别
  7. Mandatory和Optional
  8. TDS协议和FreeTDS开源实现
  9. C++ Primer Plus (第六版)编程练习记录(chapter7)
  10. PHP 的 CLI 模式简介