最近做的一个项目中,客户需求是上传Word后,Java后台转成PDF显示在网页上,在开发环境、测试环境中运行项目可以正常做到转换(当然其中碰到的各种问题我会写在下面)。
放到生产环境中除了报 invoke of:SaveAs 错误之外没有任何描述信息,无从下手,目前仍在找原因
先说下项目环境
- 操作系统:windows 7
- word版本:word2013 或 wps 2019 测试可行
- Java版本:jdk1.7.0_80
- 应用服务器:Tomcat 7
- jacob版本:1.18
以下是我从其他博客中找到的代码,开发环境和测试环境是可行的
long start = System.currentTimeMillis();
ActiveXComponent app = null;
String root = req.getSession().getServletContext().getRealPath("/");
File pdfPath=new File(root+File.separator+"pdf");
if(!pdfPath.exists()){
pdfPath.mkdir();
}
try {
//打开word应用程序
app = new ActiveXComponent("Word.Application"); //容易报错!
设置应用操作是文档不在明面上显示,只在后台静默处理。
app.setProperty("Visible", false);
//获得文档集合,用来操作我们需要处理的文档.
Dispatch docs = app.getProperty("Documents").toDispatch();
System.out.println("打开文档..." + wordFile);
//打开word文档
Dispatch doc = Dispatch.call(docs,//
"Open", //
wordFile,// FileName
false,// ConfirmConversions
true // ReadOnly
).toDispatch();
System.out.println("转换文档到PDF..." + pdfFile);
File tofile = new File(pdfFile);
//创建存放pdf的文件夹
if (tofile.exists()) {
tofile.delete();
}
//将word另存为pdf 容易报错!!!
Dispatch.call(doc,//
"SaveAs", //
pdfFile, // FileName
17);
//关闭word文档
Dispatch.call(doc, "Close", false);
long end = System.currentTimeMillis();
System.out.println("转换完成..用时:" + (end - start) + "ms.");
} catch (Exception e) {
System.out.println("========Error:文档转换失败:" + e.getMessage());
} finally {
if (app != null)
app.invoke("Quit", 0);
}
最容易出错的地方还是关键jar包 和 dll文件的位置
jar包我是选择放入Tomcat 的lib下,dll放在java的bin目录下。
错误记录:
- no jacob in java.library.path java.lang.UnsatisfiedLinkError: no jacob in java.library.path
这是DLL文件放错位置啦!dll文件一定是要放在电脑的环境变量path中的路径中才可以。网上有好多说要放好几个地方的,本人只放在了jdk的bin下。 - com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: Version
Description: An unknown COM error has occured.
dll 和 jar 包不匹配 重下一个压缩包 - Could not initialize class com.jacob.activeX.ActiveXComponent
这里错误原因不明,我换了几个版本的jar包后发现1.9和1.18没有报这个错误 - no such method error
这里错误原因不明,同一个项目我在不同机子上部署,有的机子用1.9版本会出这个错误,有的可以正常运行。 - com.jacob.com.ComFailException: Can’t co-create object
这个错误原因有很多,我自己尝试发现当把Tomcat作为后台服务启动的时候,jacob无法正常运行,用startup.bat文件启动带有黑窗口版面时候可以正常运行,这种服务启动问题自己尚未找到解决办法。通过网上查到的修改DCOM,c盘systemprofile下新建Desktop等也无效。最后只能做了黑窗口的开机启动。 - jacob.dll already loaded in another classloader
是不是第一次运行项目可以正常工作,之后会出现这个问题? 看看jar包是不是引用了多个?尝试把jar包放到jdk的lib或者tomcat的lib里。
原因为:tomcat 启动后先将tomcat/lib目录下的jar包全部读入内存,如果webapps目录里的应用程序中WEB-INF/lib目录下有相同的包,将无法加载