【问题】
已经用xsltproc生成了对应fo文件,现用fop去使用此fo生成对应pdf,结果出错:
CLi@PC-CLI-1 ~/develop/docbook/books/VBR/VBR/src $ xsltproc.exe --xinclude -o ../output/fo/MPEG_VBR.fo /home/CLi/develop/docbook/config/docbook-xsl-ns-1.76.1/fo/docbook_crl.xsl MPEG_VBR.xml Making portrait pages on USletter paper (8.5inx11in) CLi@PC-CLI-1 ~/develop/docbook/books/VBR/VBR/src $ D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/fop/fop.cmd -c D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/config/fop/conf/fop.xconf D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/books/VBR/VBR/output/fo/MPEG_VBR.fo -pdf D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/books/VBR/VBR/output/pdf/MPEG_VBR.pdf May 7, 2012 5:45:42 PM org.apache.fop.apps.FopFactoryConfigurator configure INFO: Default page-height set to: 11in May 7, 2012 5:45:42 PM org.apache.fop.apps.FopFactoryConfigurator configure INFO: Default page-width set to: 8.26in May 7, 2012 5:45:45 PM org.apache.fop.events.LoggingEventListener processEvent WARNING: Font "Symbol,normal,700" not found. Substituting with "Symbol,normal,400". May 7, 2012 5:45:45 PM org.apache.fop.events.LoggingEventListener processEvent WARNING: Font "ZapfDingbats,normal,700" not found. Substituting with "ZapfDingbats,normal,400". May 7, 2012 5:45:45 PM org.apache.fop.hyphenation.Hyphenator getHyphenationTree SEVERE: Couldn't find hyphenation pattern zh_cn May 7, 2012 5:45:47 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE: Image not found. URI: /home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/images/note.png. (See position 18:8103) May 7, 2012 5:45:48 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE: Image not found. URI: /home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/images/note.png. (No context info available) May 7, 2012 5:45:51 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE: Image not found. URI: /home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/images/note.png. (See position 77:6129) May 7, 2012 5:45:51 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE: Image not found. URI: /home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/images/note.png. (See position 94:825) May 7, 2012 5:45:51 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE: Image not found. URI: /home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/images/note.png. (No context info available) May 7, 2012 5:45:51 PM org.apache.fop.events.LoggingEventListener processEvent WARNING: Line 2 of a paragraph overflows the available area by 12112 millipoints. (See position 102:732) May 7, 2012 5:45:52 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE: Image not found. URI: /home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/images/note.png. (No context info available)
【解决过程】
1.去查看了对应的路径设置,确定此路径是正确的,而且也的确在cygwin中是可以看到图片的:
CLi@PC-CLI-1 ~/develop/docbook/books/VBR/VBR/src $ ls /home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/images annot-close.png callouts caution.svg draft.png home.svg important.svg next.png note.png prev.gif tip.gif tip.tif toc-plus.png up.svg warning.svg annot-open.png caution.gif caution.tif home.gif important.gif important.tif next.svg note.svg prev.png tip.png toc-blank.png up.gif warning.gif warning.tif blank.png caution.png colorsvg home.png important.png next.gif note.gif note.tif prev.svg tip.svg toc-minus.png up.png warning.png
2.但是结果却始终找不到该图片。
后来突然发现根本原因。因为我当前用的fop是用于windows的fop.cmd而不是用于Linux/Cygwin的./fop,所以所传入的路径:
/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/images/note.png
只能被cygwin识别,而无法被windows的fop.cmd所识别,所以报错。
所以把相关的路径配置,改成这样:
<!DOCTYPE stylesheet [ <!ENTITY xsl_ns_base_dir "/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1"> ]> <xsl:param name="admon.graphics">1</xsl:param> <xsl:param name="admon.graphics.extension">.png</xsl:param> <!-- <xsl:param name="admon.graphics.path">&xsl_ns_base_dir;/images/</xsl:param> --> <xsl:param name="admon.graphics.path">D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/images/</xsl:param>
然后就fop.cmd就可以找到对应图片,就可以正常生产pdf了,添加了note的图片的效果如下:
【总结】
如果是fop中对于图片的路径找不到,那么除了路径设置不对之外,还可能是所传入的路径,与当前所用的fop的版本不匹配。
比如我这里的,用的是windows版本的fop.cmd,结果传入的路径是cygwin中的路径:
/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/images/note.png
导致了fop报错找不到图片。
【后记】
后来,为了方便使用,为环境变量中添加了FOP_HOME的路径后,直接就可以使用fop,而不用写绝对路径了。
也就可以利用cygwin的环境,使用Linux版本的fop,而不需要用windows版本的fop.bat或fop.cmd了。
但是,后来用cygwin版本的fop去生成pdf,结果又出现了上述错误:
May 14, 2012 2:45:37 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE: Image not found. URI: /home/develop/docbook/tools_root/docbook-xsl-ns-1.76.1/images/colorsvg/tip.svg. (See position 21:51630) May 14, 2012 2:45:37 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE: Image not found. URI: /home/develop/docbook/tools_root/docbook-xsl-ns-1.76.1/images/colorsvg/tip.svg. (No context info available)
1.开始怀疑是路径写错了呢,结果却检查后,确定路径是对的。
2.上述的tools_root是用ln建立的软连接,然后以后该软链接的权限有误,无法访问,而导致图片找不到呢,结果也去确认了,是有权限访问的,不是权限问题。
3.后来,通过借鉴之前的:
去添加了execdebug参数,得到如下输出:
fop --execdebug -c D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/config/fop/conf/fop.xconf ../output/fo/MPEG_VBR.fo -pdf ../output/pdf/MPEG_VBR.pdf exec "/cygdrive/c/Program Files (x86)/Java/jre6/bin/java" -classpath "D:/ome/CLi/develop/docbook/tools/fop/lib/xmlgraphics-commons-1.4.jar;D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/fop/lib/xml-apis-ext-1.3.04.jar;D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/fop/lib/xml-apis-1.3.04.jar;D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/fop/lib/xercesImpl-2.7.1.jar;D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/fop/lib/xalan-2.7.0.jar;D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/fop/lib/serializer-2.7.0.jar;D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/fop/lib/commons-logging-1.0.4.jar;D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/fop/lib/commons-io-1.3.1.jar;D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/fop/lib/batik-all-1.7.jar;D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/fop/lib/avalon-framework-4.2.0.jar;D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/fop/build/fop.jar;D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/fop/build/fop-sandbox.jar;D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/fop/build/fop-hyph.jar;.;C:/Program Files (x86)/Java/jre6/lib/rt.jar;D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/fop/lib/xmlgraphics-commons-1.4.jar" org.apache.fop.cli.Main "-c" "D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/config/fop/conf/fop.xconf" "../output/fo/MPEG_VBR.fo" "-pdf" "../output/pdf/MPEG_VBR.pdf" May 14, 2012 3:00:38 PM org.apache.fop.apps.FopFactoryConfigurator configure INFO: Default page-height set to: 11in May 14, 2012 3:00:38 PM org.apache.fop.apps.FopFactoryConfigurator configure INFO: Default page-width set to: 8.26in May 14, 2012 3:00:40 PM org.apache.fop.hyphenation.Hyphenator getHyphenationTree SEVERE: Couldn't find hyphenation pattern zh_cn May 14, 2012 3:00:41 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE: Image not found. URI: /home/develop/docbook/tools_root/docbook-xsl-ns-1.76.1/images/colorsvg/tip.svg. (See position 19:8145)
可以看到,其中fop的执行,本质上还是调用的java去执行对应的操作,去生成pdf的。
然后才明白了,原来,即使是cygwin版本的fop,也和windows版本的fop.cmd和fop.bat一样,具体功能的实现,都还是通过调用java去实现的,而此处的java,cygwin中,是没有的,都是调用你在windows系统中所安装的java的:
CLi@PC-CLI-1 ~/develop/docbook/books/VBR/VBR/src $ which java /cygdrive/c/Windows/system32/java CLi@PC-CLI-1 ~/develop/docbook/books/VBR/VBR/src $ java -version java version "1.6.0_31" Java(TM) SE Runtime Environment (build 1.6.0_31-b05) Java HotSpot(TM) Client VM (build 20.6-b01, mixed mode)
因此,不论你是用cygwin的fop,还是windows的fop.cmd和fop.bat,其所传入的路径,也都是需要最终变成windows版本的路径,类似于这样的:
D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1
而不能是cygwin/linux中的路径:
/home/develop/docbook/tools_root/docbook-xsl-ns-1.76.1
否则,最终执行结果,就是fop(实际上是java)找不到路径,所以就会出现上述的错误。
此时,也才明白了,之前就遇到的那个问题:
给fop传入路径的时候,为什么Cygwin的路径,无法找到图片,而换成windows的路径,就可以了。
【总结2】
在使用fop时,出现Image not found的错误,除了可能是路径的确写错了之外,
比如像这里:
【已解决】docbook最后生成pdf的时候出错:严重: Image not found. URI: xxx.png. (See position xxx)
路径写的是images/example.jpg,但是当前路径中没有包含images文件夹(及及其的图片),那么当然会找不到图片。
除此之外,还要注意,给fop传递的路径,不能是cygwin/Linux的,而一定要是windows下面的路径。
因为,其实不论你使用cygwin版本的fop,还是windows版本的fop.bat和fop.cmd,其本质都是调用java去执行的,如果你的使用环境是和我一样的,是windows系统中的cygwin,由于cygwin中没有java,其所用的java都是windows版本的(安装了jre或jdk后的,for windows的),那么此时你所传入的(图片的)路径,一定要是windows版本的路径,而不能使cygwin/Linux版本的路径,否则就会出现,你觉得路径是对的,结果却是找不到图片。因为windows版本的java,是无法识别cygwin/Linux下的路径的。
【后记2】
后来由于继续折腾,暂时规避了fop中所用的Cygwin的工具cygpath的bug,更清楚的了解到,其实传入fop的路径,主要是指的是通过“–c xxx”所传入的参数,由于xxx没有被fop的cygpath处理,所以要求其必须是windows的。
详情参看:
转载请注明:在路上 » 【彻底解决】docbook中用fop从fo文件中生成pdf的过程中,即使路径是正确的,也还是会出错:SEVERE: Image not found. URI: /home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/images/note.png. (See position 18:8103)