ErrorCodeIOException转换文件

我正在尝试实现Office基于LibreOffice 4.0的PDF转换系统并始终获取ErrorCodeIOException(尝试文件格式doc,docx,txt),我的stacktrace如下:

com.sun.star.task.ErrorCodeIOException: at com.sun.star.lib.uno.environments.remote.Job.remoteUnoRequestRaisedException(Job.java:177) at com.sun.star.lib.uno.environments.remote.Job.execute(Job.java:143) at com.sun.star.lib.uno.environments.remote.JobQueue.enter(JobQueue.java:335) at com.sun.star.lib.uno.environments.remote.JobQueue.enter(JobQueue.java:304) at com.sun.star.lib.uno.environments.remote.JavaThreadPool.enter(JavaThreadPool.java:91) at com.sun.star.lib.uno.bridges.java_remote.java_remote_bridge.sendRequest(java_remote_bridge.java:639) at com.sun.star.lib.uno.bridges.java_remote.ProxyFactory$Handler.request(ProxyFactory.java:151) at com.sun.star.lib.uno.bridges.java_remote.ProxyFactory$Handler.invoke(ProxyFactory.java:133) at com.sun.proxy.$Proxy49.storeAsURL(Unknown Source) at Framework.Config.DocumentConverter.traverse(DocumentConverter.java:103) at Framework.Config.DocumentConverter.main1(DocumentConverter.java:184) at Framework.DAO.CRUD_Generic.ping(CRUD_Generic.java:71) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.apache.struts2.json.JSONInterceptor.invoke(JSONInterceptor.java:248) at org.apache.struts2.json.JSONInterceptor.intercept(JSONInterceptor.java:133) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263) at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:270) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 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:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 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:1004) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1822) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:722) 

代码如下:

import com.sun.star.beans.PropertyValue; import com.sun.star.uno.UnoRuntime;

 import java.io.File; import ooo.connector.BootstrapSocketConnector; public class DocumentConverter { /** * Containing the loaded documents */ static com.sun.star.frame.XComponentLoader xCompLoader = null; /** * Containing the given type to convert to */ static String sConvertType = ""; /** * Containing the given extension */ static String sExtension = ""; /** * Containing the current file or directory */ static String sIndent = ""; /** * Containing the directory where the converted files are saved */ static String sOutputDir = ""; /** * Traversing the given directory recursively and converting their files to * the favoured type if possible * * @param fileDirectory Containing the directory */ public static void traverse(File fileDirectory) { // Testing, if the file is a directory, and if so, it throws an exception if (!fileDirectory.isDirectory()) { throw new IllegalArgumentException( "not a directory: " + fileDirectory.getName()); } // Prepare Url for the output directory File outdir = new File(DocumentConverter.sOutputDir); String sOutUrl = "file:///" + outdir.getAbsolutePath().replace('\\', '/'); System.out.println("\nThe converted documents will stored in \"" + outdir.getPath() + "!"); System.out.println(sIndent + "[" + fileDirectory.getName() + "]"); sIndent += " "; // Getting all files and directories in the current directory File[] entries = fileDirectory.listFiles(); // Iterating for each file and directory for (int i = 0; i < entries.length; ++i) { // Testing, if the entry in the list is a directory if (entries[ i].isDirectory()) { // Recursive call for the new directory traverse(entries[ i]); } else if (entries[i].getName().contains(".doc") || entries[i].getName().contains(".txt")) { // Converting the document to the favoured type try { // Composing the URL by replacing all backslashs String sUrl = "file:///" + entries[ i].getAbsolutePath().replace('\\', '/'); // Loading the wanted document com.sun.star.beans.PropertyValue propertyValues[]; Object oDocToStore = DocumentConverter.xCompLoader.loadComponentFromURL( sUrl, "_blank", 0, new PropertyValue[0]); // Getting an object that will offer a simple way to store // a document to a URL. com.sun.star.frame.XStorable xStorable = (com.sun.star.frame.XStorable) UnoRuntime.queryInterface( com.sun.star.frame.XStorable.class, oDocToStore); // Preparing properties for converting the document propertyValues = new com.sun.star.beans.PropertyValue[1]; // Setting the filter name propertyValues[0] = new com.sun.star.beans.PropertyValue(); propertyValues[0].Name = "FilterName"; propertyValues[0].Value = "writer_pdf_Export"; // Appending the favoured extension to the origin document name int index1 = sUrl.lastIndexOf('/'); int index2 = sUrl.lastIndexOf('.'); String sStoreUrl = sOutUrl + sUrl.substring(index1, index2 + 1) + DocumentConverter.sExtension; // Storing and converting the document xStorable.storeAsURL(sStoreUrl, propertyValues); // Closing the converted document. Use XCloseable.clsoe if the // interface is supported, otherwise use XComponent.dispose com.sun.star.util.XCloseable xCloseable = (com.sun.star.util.XCloseable) UnoRuntime.queryInterface( com.sun.star.util.XCloseable.class, xStorable); if (xCloseable != null) { xCloseable.close(false); } else { com.sun.star.lang.XComponent xComp = (com.sun.star.lang.XComponent) UnoRuntime.queryInterface( com.sun.star.lang.XComponent.class, xStorable); xComp.dispose(); } } catch (Exception e) { e.printStackTrace(System.err); return; } System.out.println(sIndent + entries[ i].getName()); } } sIndent = sIndent.substring(2); } /** * Bootstrap UNO, getting the remote component context, getting a new * instance of the desktop (used interface XComponentLoader) and calling the * static method traverse * * @param args The array of the type String contains the directory, in which * all files should be converted, the favoured converting type and the * wanted extension */ public static void main1(String args[]) { if (args.length < 3) { System.out.println("usage: java -jar DocumentConverter.jar " + "\"\" \"\" " + "\"\" \"\""); System.out.println("\ne.g.:"); System.out.println("usage: java -jar DocumentConverter.jar " + "\"c:/myoffice\" \"swriter: MS Word 97\" \"doc\""); return; } com.sun.star.uno.XComponentContext xContext = null; try { // get the remote office component context xContext = BootstrapSocketConnector.bootstrap("C:\\Program Files (x86)\\LibreOffice 4.0\\program"); System.out.println("Connected to a running office ..."); // get the remote office service manager com.sun.star.lang.XMultiComponentFactory xMCF = xContext.getServiceManager(); Object oDesktop = xMCF.createInstanceWithContext( "com.sun.star.frame.Desktop", xContext); xCompLoader = (com.sun.star.frame.XComponentLoader) UnoRuntime.queryInterface(com.sun.star.frame.XComponentLoader.class, oDesktop); // Getting the given starting directory File file = new File(args[0]); // Getting the given type to convert to sConvertType = args[1]; // Getting the given extension that should be appended to the // origin document sExtension = args[2]; // Getting the given type to convert to sOutputDir = args[3]; // Starting the conversion of documents in the given directory // and subdirectories traverse(file); } catch (Exception e) { e.printStackTrace(System.err); } } } 

该行是在以下行中生成的:

 xStorable.storeAsURL(sStoreUrl, propertyValues); 

代码基于libreofice api的原始示例:

http://api.libreoffice.org/examples/java/DocumentHandling/DocumentConverter.java

如果你能提供帮助,请提前感谢

换线

  xStorable.storeAsURL(sStoreUrl, propertyValues); 

  xStorable.storeToURL(sStoreUrl, propertyValues); 

纠正了这个问题