【记录】DocBook开发过程 – 2
相关内容:
按照这里:
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虚拟机:
然后按照后,重启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 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
http://blog.microsuncn.com/?p=3204
转载请注明:在路上 » 【记录】DocBook开发过程 – 2