使用FOP生成SVG不起作用

时间:2011-12-14 13:51:22

标签: java debian ghostscript apache-fop batik

在一台服务器上,在我的Windows笔记本电脑上,使用此方法生成PDF工作正常:

http://www.databasesandlife.com/svg-to-pdf/

但是在另一台服务器上我收到了这个错误:

org.apache.batik.transcoder.TranscoderException: Error while setting up PDFDocumentGraphics2D
Enclosed Exception:
Error while setting up fonts
    at org.apache.fop.svg.PDFTranscoder.transcode(PDFTranscoder.java:189)
    at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(Unknown Source)
    at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(Unknown Source)
    at org.apache.batik.apps.rasterizer.SVGConverter.transcode(Unknown Source)
    at org.apache.batik.apps.rasterizer.SVGConverter.execute(Unknown Source)

我一直在谷歌搜索并搜索了几个小时,但无济于事。我该怎么办?

我尝试安装以下软件包,但没有帮助:

sudo apt-get install gsfonts gsfonts-x11 gsfonts-other batik \
    libbatik-java libxmlgraphics-commons-java  \
    libxmlgraphics-commons-java fop sun-java6-fonts

我的情况是:

  • Debian 6.0.3
  • Sun Java版“1.6.0_26”
  • JARs:avalon-framework-4.2.0.jar batik-all-1.7.jar commons-io-1.3.1.jar commons-logging-1.0.4.jar fop-0.95.jar log4j-1.2.15。 jar xml-apis-ext.jar xmlgraphics-commons-1.3.1.jar

2 个答案:

答案 0 :(得分:3)

真诚地,从Debian软件包在jetty结构中创建这样的临时文件并不是一个好主意。如果有更新,您可能会遇到麻烦。这样的缓存目录应位于/var,例如/var/tmp

根据documentation,如果失败,FOP应该使用临时目录。可能你的发现值得一个错误报告。

在修复之前,您应该设置cache-file option使用use-cache禁用缓存是另一种方式,但可能会影响性能。

答案 1 :(得分:2)

解决此问题的方法是log4j.properties我将关卡调高为TRACE

在那里,我看到了之前我见过的TranscoderException之前的额外日志:

2012-02-28 11:51:24,863 DEBUG: org.apache.fop.fonts.FontCache: 
   Writing font cache to /usr/share/jetty/.fop/fop-fonts.cache
org.apache.batik.transcoder.TranscoderException: 
   Error while setting up PDFDocumentGraphics2D

Horray的日志! (并写一个关于程序将要做什么的日志,而不仅仅是一旦完成它,所以如果操作失败,那么你知道它在失败时尝试做什么。)

在Debian上,Jetty网络服务器在用户jetty下运行,其主目录位于/usr/share/jetty/。但是,jetty用户没有对其自己的主目录的写访问权限,因此无法创建此~/.fop目录。

adrian@10770-02:~$ grep jetty /etc/passwd
jetty:x:107:111::/usr/share/jetty:/bin/false
adrian@10770-02:~$ ls -ld /usr/share/jetty
drwxr-xr-x 7 root root 4096 Feb 28 11:52 /usr/share/jetty/

我不知道这是设计还是错误,但创建此目录以便Jetty可以编写它...

sudo mkdir -p -m 0777 /usr/share/jetty/.fop

......解决了这个问题。