private void wordToPdf(String formYear,String code){ //String filename = "d:/2013上半年个人总结(黄秋稳).doc"; String templatePath = Thread.currentThread().getContextClassLoader().getResource("").toString().replace("classes/", "formFile/file/"); String filename = templatePath + formYear + "-" + code + ".doc.doc"; String toFilename = filename.replace("doc.doc", "pdf"); System.out.println("启动Word..."); long start = System.currentTimeMillis(); ActiveXComponent app = null; try { app = new ActiveXComponent("Word.Application"); app.setProperty("Visible", false); Dispatch docs = app.getProperty("Documents").toDispatch(); System.out.println("打开文档..." + filename); Dispatch doc = Dispatch.call(docs,"Open",filename,false, true).toDispatch(); System.out.println("转换文档到PDF..." + toFilename); File tofile = new File(toFilename); if (tofile.exists()) { tofile.delete(); } // Dispatch.call(doc,"SaveAs", toFilename,17); //Dispatch.invoke(doc,"SaveAs",17, new Object[]{toFilename,new Integer(1)},new int[1]); Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {toFilename,new Integer(17)}, new int[1]); 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); } } } 上述是对应的实现代码,第一次使用的时候是没有问题的。但是在session不死的情况下当再次执行上述代码胡时候就会出现问题,无法转换了,我跟了一下程序,问题出现在 |
|
5分 |
什么版本的word?07的话要装一个插件SaveAsPDFandXPS,windows的。
|
我安装的版本是2010,那还需要安装插件吗
|
|
是的。
|
|
能不能写代码解决啊?总觉着这样安装插件的方式不是很好,还有您有这个插件吗?有的话能不能发个,邮箱:wen__3344@163.com(wen与3344之间有两个下划线)
|
|
也可能不是这个原因,我下载了插件,安装上之后仍然存在这样的问题
|
|
还有没有遇到过这样的问题的同胞啊?给说一下呗!急切等到支援啊
|
|
5分 |
从头到尾,没看到你啥问题。报的异常呢?谁愿意一步步的问你 |
启动Word... 打开文档...file:/D:/Projects/pangjc/java/workspace/gwyc/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/gwyc/WEB-INF/formFile/file/2013-00104.doc.doc 转换文档到PDF...file:/D:/Projects/pangjc/java/workspace/gwyc/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/gwyc/WEB-INF/formFile/file/2013-00104.pdf ========Error:文档转换失败:Invoke of: SaveAs Source: Microsoft Word Description: 命令失败 |
|
启动Word... 打开文档...file:/D:/Projects/pangjc/java/workspace/gwyc/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/gwyc/WEB-INF/formFile/file/2013-00104.doc.doc 转换文档到PDF...file:/D:/Projects/pangjc/java/workspace/gwyc/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/gwyc/WEB-INF/formFile/file/2013-00104.pdf ========Error:文档转换失败:Invoke of: SaveAs Source: Microsoft Word Description: 命令失败
|
|
就是上述的方法,如果是单单写一个小程序。如下:
package com.huang; import java.io.File; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; public class TestWord2Pdf { /** * @param args */ static final int wdDoNotSaveChanges = 0;// 不保存待定的更改。 static final int wdFormatPDF = 17;// PDF 格式 public static void main(String[] args) { // TODO Auto-generated method stub String filename = "D:/test.docx"; String toFilename = filename + ".pdf"; System.out.println("启动Word"); long start = System.currentTimeMillis(); ActiveXComponent app = null; try { app = new ActiveXComponent("Word.Application"); app.setProperty("Visible", false); Dispatch docs = app.getProperty("Documents").toDispatch(); System.out.println("打开文档" + filename); Dispatch doc = Dispatch.call(docs,// "Open", // filename,// FileName false,// ConfirmConversions true // ReadOnly ).toDispatch(); System.out.println("转换文档到PDF" + toFilename); File tofile = new File(toFilename); if (tofile.exists()) { tofile.delete(); } Dispatch.callN(doc,// "SaveAs", // toFilename, // FileName 17); 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); } } } 没有任何问题,不论执行多少遍。但是如果是走服务器就会出现上面的问题。 |
|
5分 |
jacob支持03office一点也不好。还是换用别的转换工具吧。
|
5分 |
我建议楼主还是用openoffice转换吧,安全的多。而且不像调用com转换这样只能一个一个来,不能并发,速度慢。
|
5分 |
openofficec好像转出来的效果不怎么好,微软word应该可以用acrobat控件来转的 |
5分 |
话说save as 转出来的pdf word里的图片感觉发虚,不知道可不可以通过调节参数什么的解决这个问题
|
额也不知道
|
|
3.1.1 后台管理
3.1.1.1 服务权限管理 3.1.1.2 服务管理 3.1.1.3 系统管理 3.1.1.4 数据管理 3.1.2 前台服务 3.1.2.1 非数据服务 3.1.2.2 HR领域 3.1.2.3 财务领域 3.1.2.4 采购领域 3.1.2.5 服务领域 3.1.2.6 销售领域 3.1.2.7 供应链领域 3.1.2.8 研发领域 3.1.4 服务控件 3.1.4.1 部门选择控件 3.1.4.2 HR权签人选择控件 3.1.4.3 SSE权签人选择控件 3.1.4.4 人员ID选择控件 3.1.4.5 人员详细信息查询控件 3.1.4.6 供应商查询控件 3.1.4.7 COA部门选择控件 3.1.4.8 客户查询控件 3.1.4.10 PBI查询控件 |
|
jacob,doc转PDF,多线程处理的效果是串行的,并非并行,提高不了效率,而OpenOffice转换虽然速度快,可有些内容转不出来,一般处理几个没问题,如果有几十上百个则save as与Close都可能有问题,试过多进程,可没法判断是否转换成功,因为有的即使没报错,也不一定成功了,想请教各位神们,有没有好的推荐与方法处理,不胜感激…
|
|
这人最后还是用的Jacob
|
|
Jacob 可以的啊。 07 03 都可以的。
|
|
10分 |
你可以试试不要close 只是不会输出文件,多个文件转换再关闭。类似实现批处理功能。转化多少个文件再close一次,然后重新打开资源。 |
顶一下,怕自己以后用到
|
|
5分 |
可不可以理解为你的意思是一个程序应用下打开多个word文档,再去转换,期间,当然也必须得是一个一个的转,我试过,貌似Office就是不支持多个一起并行的玩,至于你说的程序卡死的问题,这是很大的问题,如果进程卡死掉,那必须得Kill掉吧,因为规定必须得用JMS实现,所以实际上我的做法是,JMS发送要转换的文档信息,比如路径啥的,开启多个Receive消费者,用多进程的处理,每个进程转一个文档,效率肯定相比串行好多了,也相对还稳定点,不过仍然会有卡死进程的问题,此时应该Kill掉,再生成一个,可是因为生成的进程,进程名都是一样的,用java得到pid,虽然是做到了,可是通过代码启动的进程和手动启动,是有些微区别的,我要拿到这些区别,比较烦啊。。。 |
5分 |
没办法啊,一把辛酸泪, 毕竟Jacob调用ActiveX组件转换的效果还真是没得说的,客户需要,你懂的。。。 |