SVG генерация с FOP не работает - PullRequest
3 голосов
/ 14 декабря 2011

На одном сервере и на моем ноутбуке с 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"
  • JAR: 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 ]

3 голосов
/ 03 марта 2012

С уважением, создавать такие временные файлы внутри структуры jetty из пакета Debian не очень хорошая идея. В случае обновления вы можете столкнуться с проблемами. Такой каталог кэша должен находиться в /var, например, /var/tmp.

Согласно документации , FOP должен использовать временный каталог в случае сбоя. Возможно, ваш вывод заслуживает сообщения об ошибке.

Пока это не исправлено, вы должны установить cache-file option Отключение кэша с помощью use-cache - это еще один способ, но, вероятно, с влиянием на производительность.

2 голосов
/ 28 февраля 2012

Подход к решению этой проблемы заключается в 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

Ужас для логов! (И запись журнала о том, что программа собирается делать, а не только после того, как она это сделала, чтобы в случае сбоя операции вы знали, что она пыталась сделать, пока она не удалась.)

В 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

... решил проблему.

...