word转pdf 关于使用jacob碰到的那些坑

最近做的一个项目中,客户需求是上传Word后,Java后台转成PDF显示在网页上,在开发环境、测试环境中运行项目可以正常做到转换(当然其中碰到的各种问题我会写在下面)。
放到生产环境中除了报 invoke of:SaveAs 错误之外没有任何描述信息,无从下手,目前仍在找原因

先说下项目环境

  1. 操作系统:windows 7
  2. word版本:word2013 或 wps 2019 测试可行
  3. Java版本:jdk1.7.0_80
  4. 应用服务器:Tomcat 7
  5. 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目录下。

错误记录:

  1. no jacob in java.library.path java.lang.UnsatisfiedLinkError: no jacob in java.library.path
    这是DLL文件放错位置啦!dll文件一定是要放在电脑的环境变量path中的路径中才可以。网上有好多说要放好几个地方的,本人只放在了jdk的bin下。
  2. com.jacob.com.ComFailException: A COM exception has been encountered:
    At Invoke of: Version
    Description: An unknown COM error has occured.
    dll 和 jar 包不匹配 重下一个压缩包
  3. Could not initialize class com.jacob.activeX.ActiveXComponent
    这里错误原因不明,我换了几个版本的jar包后发现1.9和1.18没有报这个错误
  4. no such method error
    这里错误原因不明,同一个项目我在不同机子上部署,有的机子用1.9版本会出这个错误,有的可以正常运行。
  5. com.jacob.com.ComFailException: Can’t co-create object
    这个错误原因有很多,我自己尝试发现当把Tomcat作为后台服务启动的时候,jacob无法正常运行,用startup.bat文件启动带有黑窗口版面时候可以正常运行,这种服务启动问题自己尚未找到解决办法。通过网上查到的修改DCOM,c盘systemprofile下新建Desktop等也无效。最后只能做了黑窗口的开机启动。
  6. jacob.dll already loaded in another classloader
    是不是第一次运行项目可以正常工作,之后会出现这个问题? 看看jar包是不是引用了多个?尝试把jar包放到jdk的lib或者tomcat的lib里。
    原因为:tomcat 启动后先将tomcat/lib目录下的jar包全部读入内存,如果webapps目录里的应用程序中WEB-INF/lib目录下有相同的包,将无法加载
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值