我正在使用Java小程序来生成XLS文件作为输出。在我让用户查看,下载和打印文档之前,我需要将其转换为PDF(甚至更好的PDF / A),因为我需要它不可修改。
我尝试编码解决方案,并且可以正常工作。我在小程序中下载并捆绑了JODConverter 2,以便输出XLS成为JODConverter输入文件,并且一切正常。问题是该组件的大小:将近2mb。由于我的小程序已经是3mb了,所以我也不想将JODConverter捆绑在其中...
我在文档中读到它也可以用作Web服务:我创建了POST请求,将其发送到服务并获取文件,所有这些都无需下载一个kb的JODConverter。听起来不错,但我无法正常工作。
以下是我编写的代码:
public class Main
{
public static void main(String[] args) throws Exception
{
doPost(new URL("http://localhost:8090/pdfconverter/service"), "C:\\Documents and Settings\\Administrator\\Desktop\\Gestione oneri\\calcolo oneri XP.xls");
}
private static void doPost(URL url, String binaryFile)
{
try
{
File binFile = new File(binaryFile);
URLConnection conn = url.openConnection();
conn.addRequestProperty("Content-Type", "multipart/form-datastrong text");
conn.addRequestProperty("Accept", "application/pdf");
conn.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
FileInputStream input = new FileInputStream(binFile);
byte[] buffer = new byte[1024];
for(int length = 0; (length = input.read(buffer)) > 0;)
{
wr.write(buffer, 0, length);
}
wr.flush(); // Important! Output cannot be closed. Close of writer will close output as well.
// Get the response and write it to a file.
File file = new File("C:\\Documents and Settings\\Administrator\\Desktop\\Gestione oneri\\calcolo oneri XP2.pdf");
FileOutputStream wrFile = new FileOutputStream(file);
DataInputStream dataInput = new DataInputStream(conn.getInputStream());
buffer = new byte[1024];
for(int length = 0; (length = dataInput.read(buffer)) > 0;)
{
wrFile.write(buffer, 0, length);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
我立即下载了一个包含JODConverter Web服务的WAR,并将其放入我的tomcat \ webapps \ pdfconverter中,创建了脚本来启动OpenOffice服务。
soffice -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\" -nofirststartwizard
但是这是我的堆栈跟踪:
java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8090/pdfconverter/service
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at main.Main.doPost(Main.java:128)
at main.Main.main(Main.java:25)
其中Main.java:128是一行
DataInputStream dataInput = new DataInputStream(conn.getInputStream());
Tomcat日志显示如下:
访问日志:
127.0.0.1 - - [30/Jan/2013:11:45:24 +0100] "POST /pdfconverter/service HTTP/1.1" 500 4426
[将内容类型从文本/纯文本更改为多部分/表单数据后进行编辑]
标准日志:
Grave: Servlet.service() for servlet [DocumentConverterServiceServlet] in context with path [/pdfconverter] threw exception
java.lang.IllegalArgumentException: unsupported input mime-type: multipart/form-data
at com.artofsolving.jodconverter.web.DocumentConverterServiceServlet.doPost(DocumentConverterServiceServlet.java:69)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
我相信POST中有问题,因为在转换过程中发生了异常,但是我似乎找不到问题所在:所发布的代码是各种试验和错误的最新版本,所以也许在此之前带有正确的POST代码,并弄乱了其他内容...
任何建议表示赞赏!
最佳答案
最初,您以.xls
的形式发送Mime-Type
文件,并且text/plain
出现异常,该异常表示由于某些错误,它无法解析您的文档(可能是您的JODConverter 2试图将.xls
文件转换为文件)。
这是第一个例外。现在,您将获得.txt
不受支持的异常。此multipart/form-data
永远不会代表文档,如果您想将一个文档更改为.pdf,则必须提供有效的Mime-Type
定义。
对于Mime-Type
文件,此有效.xls
是Mime-Type
。您可以在这里找到其他类型:mime-types for xls。
此更改应允许您将请求发送到JODConverter