最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【记录】DocBook开发过程 – 2

工作和技术 crifan 2404浏览 0评论

【记录】DocBook开发过程 – 2


相关内容:

【整理】DocBook 开发过程记录 – 1

 【记录】DocBook 开发过程中所用到的一些命令的log


按照这里:

http://easwy.com/blog/archives/install-apache-fop-on-windows/

说的,去执行:

$ java -cp build\fop.jar;lib\avalon-framework-4.2.0.jar;lib\commons-logging-1.0.4.jar;lib\commons-io-1.3.1.jar;lib\xmlgraphics-commons-1.4.
jar org.apache.fop.fonts.apps.TTFReader -ttcname SimSun c:\windows\fonts\simsun.ttc fonts\simsun.xml

结果出错,后来发现是反斜杠路径在Cygwin中不识别,所以改成这样就可以了:

$ java -cp build/fop.jar;lib/avalon-framework-4.2.0.jar;lib/commons-logging-1.0.4.jar;lib/commons-io-1.3.1.jar;lib/xmlgraphics-commons-1.4.
jar org.apache.fop.fonts.apps.TTFReader -ttcname SimSun /cygdrive/c/WINDOWS/Fonts/simsun.ttc fonts/simsun.xml

但是又出错了:

lib/avalon-framework-4.2.0.jar: line 1: $'PK\003\004': command not found
lib/avalon-framework-4.2.0.jar: line 2: syntax error near unexpected token `)'
lib/avalon-framework-4.2.0.jar: line 2: `h ?0   META-INF/PKg ?0META-INF/MANIFEST.MF???j?0 E?????D??;???@J???A'???(???+;4?&???{?WZ#???I}S?? <?
????W?ak<K?<8?&???{)6h:?R!n5N??#??????)???Z???8f?_??8'?q??????s???k??4??>f??x??6?0T??v??/?|.-?R?~K???R????'N??????_?PQ??VSI!?Pm??>?PK  '
lib/commons-logging-1.0.4.jar: line 1: $'PK\003\004': command not found
lib/commons-logging-1.0.4.jar: line 2: syntax error near unexpected token `)'
lib/commons-logging-1.0.4.jar: line 2: ` ??0    META-INF/PK ??0META-INF/MANIFEST.MF?????0 E{K??)??E?m?   ?dE?f?I??g"?<??y?D??}???A?u?l)v^8???
?{?????? C_??% ???? ????c?? ??F??s?U???w???-q)??U!U:c$X??G???>m ?q???????VZ]P??>?FPK  '
lib/commons-io-1.3.1.jar: line 1: $'PK\003\004': command not found
lib/commons-io-1.3.1.jar: line 2: $'\372\213I6': command not found
lib/commons-io-1.3.1.jar: line 3: syntax error near unexpected token `)'
lib/commons-io-1.3.1.jar: line 3: ??I6?|?META-INF/MANIFEST.MF??MK 1 ??????S Z?b{[???T??????L?????,??^?yg??yr?I?b??BM?D?? ?*?}G?k ??uDH??????1
PK  '?[??Bq? 84??g??c)??        ???#??e??u@?:g!>X4?O)??v^s?> ?Z???C????]??B?<I??|?GJ??y?Q?%?2T7??cRH?
lib/xmlgraphics-commons-1.4.jar: line 1: $'PK\003\004': command not found
lib/xmlgraphics-commons-1.4.jar: line 2:  META-INF/??PK  : No such file or directory
lib/xmlgraphics-commons-1.4.jar: line 3: syntax error near unexpected token `)'
h"I????? ??s????V\????R?(&a?Ue;???5o?g?0?;??u??p?N)? ?zRP??h{?NJ???0(???P?;?D?z?K~???d????B??A+?'? ??c?V???h?O???zR???ι1???П??0_??-??9?~?n
@d???{??$??4A+?6d?a????9P?^<??s??K  '

看到这里:

http://old.nabble.com/TTFReader-error-td23353910.html

的解释,把分号”;”换成冒号“:”,就可以了。

后来又在这里:

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

看到的解释,比较清楚:

Windows:
java -cp build\fop.jar;lib\avalon-framework.jar;lib\commons-logging.jar;lib\commons-io.jar            org.apache.fop.fonts.apps.PFMReader [options] pfm-file xml-file
Unix:
java -cp build/fop.jar:lib/avalon-framework.jar:lib/commons-logging.jar:lib/commons-io.jar            org.apache.fop.fonts.apps.PFMReader [options] pfm-file xml-file

但是又出了其他的错:

E516537@CH3UDTDJ9G4C2X /cygdrive/d/dev_root/DocBook/config/tool/fop/fop-1.0
$ java -cp build/fop.jar:lib/avalon-framework-4.2.0.jar:lib/commons-logging-1.0.4.jar:lib/commons-io-1.3.1.jar:lib/xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader -ttcname SimSun /cygdrive/c/WINDOWS/Fonts/simsun.ttc fonts/simsun.xml
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/fop/fonts/apps/TTFReader
Caused by: java.lang.ClassNotFoundException: org.apache.fop.fonts.apps.TTFReader
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: org.apache.fop.fonts.apps.TTFReader.  Program will exit.

 

后来去java网站下载了最新的java虚拟机:

http://sdlc-esd.sun.com/ESD6/JSCDL/jre/6u29-b110/JavaSetup6u29.exe?AuthParam=1320892609_47c793e152eb1e4aee0b6cfe12a5007c&GroupName=JSC&FilePath=/ESD6/JSCDL/jre/6u29-b110/JavaSetup6u29.exe&File=JavaSetup6u29.exe&BHost=javadl.sun.com

然后按照后,重启Cygwin,再次尝试,也还是同样错误。

网上找了半天,结果刚开始以为是“Could not find the main class: org.apache.fop.fonts.apps.TTFReader”方面的问题,以为是fop的class找不到呢,结果弄了半天,觉得好像是“java.lang.ClassLoader.loadClass(Unknown Source)”方面的问题,即本身java就缺少自身的一些类,即java没有安装好。

去参考了这里:

http://www.cnblogs.com/phinecos/archive/2006/06/02/416166.html

去Cygwin中通过

java -version

可以查看到java的版本。又通过:

which java

得知当前用的java是在C:\windows\system32下面的java,而不是我最新安装到D盘的Java6,所以去删除了system32下面的java,确保环境变量中也设置好了:

JAVA_HOME=C:\Program Files\Java\jre6
CLASSPATH=.;%JAVA_HOME%\lib\rt.jar;

然后重启Cygwin,试了还是不行。

后来去删除了之前安装的JRE,重新去Java主页中:

http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u1-download-513651.html

下载了最新的JDK7(jdk-7u1-windows-i586.exe),然后安装后,设置好环境变量:

JAVA_HOME=D:\Program Files\Java\jdk1.7.0_01
CLASSPATH=.;%JAVA_HOME%\lib\;

把%JAVA_HOME%\bin;加到Path变量中

再重启Cygwin尝试,果然,可以解决了Java的本身的问题。

此处的总结是,如果出现了“java.lang.ClassLoader.loadClass(Unknown Source)”之类的问题,那很明显是说明Java本身的一些class没找到,说明Java没有安装好,而需要确保安装好了Java,注意,此处的Java,指的是JDK,而不是JRE。

JDK是Java的整个开发环境,JRE是只是Java的运行环境,只支持你Java程序运行而已。

装好了JDK,而且还要设置好对应的配置,主要是JAVA_HOME和CLASSPATH。

Java本身的问题排除了。不过还是出现了关于fop的问题:

E516537@CH3UDTDJ9G4C2X /cygdrive/d/dev_root/DocBook/config/tool/fop/fop-1.0
$ java -cp build/fop.jar:lib/avalon-framework-4.2.0.jar:lib/commons-logging-1.0.4.jar:lib/commons-io-1.3.1.jar:lib/xmlgraphics-commons-1.4.jar  org.apache.fop.fonts.apps.TTFReader -ttcname SimSun /cygdrive/c/WINDOWS/Fonts/simsun.ttc fonts/simsun.xml
Error: Could not find or load main class org.apache.fop.fonts.apps.TTFReader

需要说明的是,在参考:

http://easwy.com/blog/archives/install-apache-fop-on-windows/

的过程中,关于用java命令去生成对应的字体的xmll文件的时候,看到这里:

java -cp build\fop.jar;lib\avalon-framework-4.2.0.jar;lib\commons-logging-1.0.4.jar;lib\commons-io-1.3.1.jar;lib\xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader -ttcname SimSun c:\windows\fonts\simsun.ttc fonts\simsun.xml

我一直默认觉得是在Cygw下面运行此命令的,所以,改成对应的上面的那些命令的,结果一直出错,网上参考了很多帖子,都还是无法解决问题。

中间曾经怀疑过,是不是当前的系统需要安装对应的fop.fonts.apps.TTFReader,而我此处没有安装,所以提示找不到。

后来网上搜索,找到过一个0.93的fop(fop-0.93-jdk15.jar),此jar里面是有对应的TTFReader的class的。

然后想要打算拷贝过来用的,结果发现,其实,本身此处的fop中的build文件夹下面的fop.jar就是对应1.0版本的fop.jar,其中,同样包含对应的fop.fonts.apps.TTFReader,这点,也可以通过用7zip软件解压fop.jar而看到对应的TTFReader.class的。所以,不是缺少了fop.fonts.apps.TTFReader而无法运行。

而且,也搞懂了,此处java中的-cp参数,就是-classpath,就是手动添加对应的class的查找路径,以找到对应的此处的类org.apache.fop.fonts.apps.TTFReader的。所以,此处看起来,参数也正确,而且也确保build/fop.jar中包含这个类的。

但是,最后结果始终是,在Cygw下面,运行:

$ java -cp build/fop.jar:lib/avalon-framework-4.2.0.jar:lib/commons-logging-1.0.4.jar:lib/commons-io-1.3.1.jar:lib/xmlgraphics-commons-1.4.jar&nbsp; org.apache.fop.fonts.apps.TTFReader -ttcname SimSun /cygdrive/c/WINDOWS/Fonts/simsun.ttc fonts/simsun.xml

是始终无法正常运行的,始终会提示“Error: Could not find or load main class org.apache.fop.fonts.apps.TTFReader”,至少我这里是这样的。

后来,受到这里:

http://www.mail-archive.com/[email protected]/msg04393.html

的启示,突然想起来,java是可以跨平台运行的,所以去在Windows中的cmd下面,运行对应的命令,如下,是可以正常执行的:

D:\dev_root\DocBook\config\tool\fop\fop-1.0>java -cp build\fop.jar;lib\avalon-framework-4.2.0.jar;lib\commons-logging-1.0.4.jar;lib\commons-io-1.3.1.jar;lib\xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader -ttcname SimSun c:\WINDOWS\Fonts\simsun.ttc fonts\simsun.xml
TTF Reader for Apache FOP 1.0
Parsing font...
Reading c:\WINDOWS\Fonts\simsun.ttc...
This is a TrueType collection file with 3 fonts
Containing the following fonts:
SimSun <-- selected
NSimSun
SimSun-PUA
Font Family: [宋体, SimSun]
Creating xml font file...
Creating CID encoded metrics...
Writing xml font file fonts\simsun.xml...
This font contains no embedding license restrictions.
XML font metrics file successfully created.

算是经历千辛万苦,终于可以生成字体的xml文件了。

再按照同样方法,去生成simhei.xml文件。

再去为了后面的命令执行,而把xsltproc.exe所在的位置:

D:\dev_root\DocBook\config\tool\xsltproc\libxslt-1.1.26.win32\bin

加到Path变量中去。

后来去建立了一个测试的xml文件cn_xml_book_test.xml,然后内容是从网上:

http://easwy.com/blog/archives/install-apache-fop-on-windows/

拷贝过来的。

结果去执行的时候,显示无法转换,错误位置是指向“我的第一篇Docbook 5.0文档”中第一个字符“我”,所以,很明显是由于字符编码不支持,而原先的cn_xml_book_test.xml是用notepad++打开的,所以去把字符编码改为UTF-8(无BOM)格式的,然后再重新从上面的网上的拷贝范例内容,这时候看内容也可以正常在notepad++中以UTF-8的编码格式显示了。

然后按照要求,建立好对应的docbook_fo.xsl文件:

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exsl="http://exslt.org/common"
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  xmlns:ng="http://docbook.org/docbook-ng"
  xmlns:db="http://docbook.org/ns/docbook"
  exclude-result-prefixes="db ng exsl"
  version='1.0'>
  <!-- <xsl:import href="C:/docbook/docbook-xsl-1.74.3/fo/docbook.xsl"/> -->
  <xsl:import href="D:/dev_root/DocBook/config/style/xsl/1.76.1/docbook-xsl-1.76.1/fo/docbook.xsl"/>
  <xsl:param name="body.font.family">SimSun</xsl:param>
  <xsl:param name="monospace.font.family">SimSun</xsl:param>
  <xsl:param name="title.font.family">SimHei</xsl:param>
</xsl:stylesheet>

将其放在了对应的位置:D:\dev_root\DocBook\config\tool\fop\fop-1.0\conf

然后再去通过命令:

(注意,下面不论是xsltproc命令还是fop命令的执行,都是在Windows的cmd下面执行的,而不是在Cygwin中的bash中执行的。

因为我们下载的xsltproc.exe,就是win32的可执行文件,不过fop呢,倒是既有可以在bash下面执行的fop脚本文件,也有windows下面可执行的fop.bat和fop.cmd

不过,经过后来的测试,实际上,在Cygwin下面,是可以运行xsltproc这个exe文件的,但是,

如果是原先的斜杠路径,则会出现这样的错误:

$ xsltproc -o D:\dev_root\DocBook\dev\src\output\fo\cn_xml_book_test.fo  D:\dev_root\DocBook\config\tool\fop\fop-1.0\conf\docbook_fo.xsl D:\dev_root\D ocBook\dev\src\cn_xml_book_test.xml warning: failed to load external entity “D:dev_rootDocBookconfigtoolfopfop-1.0confdocbook_fo.xsl”

而如果是手动改成cygdrive的格式,也是不行的,也会出错:

$ xsltproc -o /cygdrive/d/dev_root/DocBook/dev/src/output/fo/cn_xml_book_test.fo  /cygdrive/d/dev_root/DocBook/config/tool/fop/fop-1.0/conf/docbook_fo .xsl /cygdrive/d/dev_root/DocBook/dev/src/cn_xml_book_test.xml warning: failed to load external entity “/cygdrive/d/dev_root/DocBook/config/tool/fop/fop-1.0/conf/docbook_fo.xsl” cannot parse /cygdrive/d/dev_root/DocBook/config/tool/fop/fop-1.0/conf/docbook_fo.xsl

经过一番测试,将普通的windows中的路径中的反斜杠,换成斜杠,类似于这样:

xsltproc -o D:/dev_root/DocBook/dev/src/output/fo/cn_xml_book_test.fo  D:/dev_root/DocBook/config/dtd/5.0/xsl-ns/docbook_fo_utf-8.xsl  D:/dev_root/DocBook/dev/src/cn_xml_book_test.xml

就可以正常运行了。

总结一下就是:

【想要在Cygwin中执行对应的windows中的exe可执行文件】

cygwin中,是可以运行普通的win32的exe程序的。

但使用原先的windows的带反斜杠的路径,或者改为cygdrive那种的地址,都是不行的,

只有将对应的路径中的反斜杠””,全部换成为斜杠”/”,才可以正常执行对应的win32的exe。

D:\dev_root\DocBook\dev\src>xsltproc -o output\fo\cn_xml_book_test.fo D:\dev_root\DocBook\config\tool\fop\fop-1.0\conf\docbook_fo.xsl cn_xml_book_test.xml
Note: namesp. cut : stripped namespace before processing           鎴戠殑绗竴绡嘍ocbook 5.0鏂囨。
WARNING: cannot add @xml:base to node set root element.  Relative paths may not work.
Note: namesp. cut : processing stripped document                   鎴戠殑绗竴绡嘍ocbook 5.0鏂囨。
Making portrait pages on USletter paper (8.5inx11in)

(注:后来去下载了:

docbook-xsl-ns-1.76.1.tar.bz2

然后再用对应的xsl编译,就没了上面的warning提示了。)

生成了对应的fo文件,虽然上面看起来好像是有些乱码,但是好像也是不影响输出内容的。先不管,继续往下试试再说。

最后,通过执行:

D:\dev_root\DocBook\config\tool\fop\fop-1.0>fop -c D:\dev_root\DocBook\config\tool\fop\fop-1.0\conf\fop.xconf D:\dev_root\DocBook\dev\src\output\fo\cn_xml_book_test.fo -pdf D:\dev_root\DocBook\dev\src\output\pdf\cn_xml_book_test.pdf

而生成了对应的pdf文件,中文也是可以正确显示的。


【参考资料】

1. 使用Apache FOP将Docbook文档转换成PDF
http://easwy.com/blog/archives/render_docbook_xml_to_pdf_by_apache_fop/

2. 在Windows上安装配置Apache FOP
http://easwy.com/blog/archives/install-apache-fop-on-windows/

3. 一个简单的Docbook 5.0例子
http://easwy.com/blog/archives/a-simple-docbook-5-example/

4. 使用FOP将中文DocBook xml转换成pdf的实现记录
http://blog.donews.com/limodou/archive/2004/04/01/9917.aspx

5. 使用Apache FOP将Docbook转换成PDF文档

http://blog.chinaunix.net/space.php?uid=191839&do=blog&id=85830

6. 将Docbook文档转换成PDF

http://blog.microsuncn.com/?p=3204

转载请注明:在路上 » 【记录】DocBook开发过程 – 2

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
80 queries in 0.185 seconds, using 22.39MB memory