最新消息:20210917 已从crifan.com换到crifan.org

【彻底解决】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)

Docbook crifan 1610浏览 0评论

【问题】

已经用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的图片的效果如下:

note pic

【总结】

如果是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.后来,通过借鉴之前的:

【已彻底解决】docbook中cygwin/linux下的fop运行出错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlgraphics/image/loader/ImageContext

去添加了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中cygwin/linux下的fop运行出错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlgraphics/image/loader/ImageContext

转载请注明:在路上 » 【彻底解决】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)

发表我的评论
取消评论

表情

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

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
92 queries in 0.195 seconds, using 23.50MB memory