2015-12-09 2 views
2

У меня есть сервлет, где я пытаюсь создать pdf-файл из строки, содержащей svg-код. Поэтому у меня есть этот код:Java Batik: ClassNotFoundException: org.apache.batik.dom.svg.SVGDOMImplementation

public class Conversion extends HttpServlet { 

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     String svgString = req.getParameter("svg"); 
     StringReader svg = new StringReader(svgString); 
     File pdf = new File("/tmp/chart.pdf"); 

     Transcoder transcoder = new PDFTranscoder(); 
     TranscoderInput transcoderInput = new TranscoderInput(svg); 
     TranscoderOutput transcoderOutput = new TranscoderOutput(new FileOutputStream(pdf)); 

     try { 
      transcoder.transcode(transcoderInput, transcoderOutput); 
     } catch (TranscoderException e) { 
      e.printStackTrace(); 
     } 

     resp.setContentType("application/pdf"); 
     InputStream in = new FileInputStream(pdf); 
     ServletOutputStream out = resp.getOutputStream(); 

     byte[] buffer = new byte[4096]; 
     while(in.read(buffer, 0, 4096) != -1){ 
      out.write(buffer, 0, 4096); 
     } 
     in.close(); 
     out.flush(); 
     out.close(); 
    } 
} 

При выполнении я получаю эту ошибку:

java.lang.ClassNotFoundException: org.apache.batik.dom.svg.SVGDOMImplementation 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1332) 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1166) 
    at org.apache.fop.svg.AbstractFOPTranscoder.<init>(AbstractFOPTranscoder.java:107) 
    at org.apache.fop.svg.PDFTranscoder.<init>(PDFTranscoder.java:84) 
    at com.Webmap_read.Conversion.doGet(Conversion.java:38) 
    at com.Webmap_read.Conversion.doPost(Conversion.java:68) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1526) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1482) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

Когда я проверить мой Путь сборки, это, кажется, как и все баночки, которые содержатся в файле +1,8 архива Батик скачанный от: http://apache.lauf-forum.at/xmlgraphics/batik/binaries/. Но класса SVGDOMImplementation нет. Как я могу импортировать все необходимые JAR/классы и почему они не содержатся в стандартном zip-файле? Это сводит меня с ума прямо сейчас ... Или может быть, более простой способ конвертировать SVG в PDF?

+0

Я думаю, что это дубликат: http: //stackoverflow.com/questions/30092651/where-has-org-apache-batik-dom-svg-svgdomimplementation-gone https://issues.apache.org/ jira/browse/BATIK-1098 И это легко исправить :) – rjdkolb

ответ

0

Посмотрите на http://www.findjar.com/class/org/apache/batik/dom/svg/SVGDOMImplementation.html чек, если какой-либо из перечисленных банок находится в пути класса приложения.

Я предлагаю вам скачать Batik из https://xmlgraphics.apache.org/batik/download.html (официального сайта)

+0

Спасибо за сайт. Ни один из перечисленных там банок не содержится в моем проекте, но, похоже, в версии 1.8 банки больше не содержат этот класс. Я попробовал разные загрузки, и они выглядят одинаково. Они предлагают исходный и двоичный дистрибутив, в то время как источник просто содержит много .java-файлов, поэтому я только попробовал двоичную версию. Я не понимаю, почему они настолько усложняют эту настройку? – flixe

+0

Да, управление зависимостями - ад. Это причина существующих Maven, Gradle и т. Д. Если вы можете настроить свой проект на использование Gradle, сделайте это. – andrucz

+0

Я знаю, что эта тема устарела. Я нашел класс, который был перенесен в batik-anim.jar. Я не могу понять, как заставить pdfTranscoder использовать это другое расположение пакета. –

0

Убедитесь, что все необходимые файлы, связанные с/баночка присутствует при компиляции класса. Просто укажите любые и все связанные папки, используя javac -cp "[path to first folder with related jars]\*;[path to second folder with related jars]\*;[path to last folder with related jars]\*" yourclass.java.