java doc转PDF

J2EE 码拜 9年前 (2015-04-18) 1434次浏览 0个评论
 
	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不死的情况下当再次执行上述代码胡时候就会出现问题,无法转换了,我跟了一下程序,问题出现在
Dispatch.invoke(doc,  
          “SaveAs”,  
          Dispatch.Method,  
          new Object[] {toFilename,new Integer(17)},  
          new int[1]);  
代码执行到这里胡时候出错得,有没有解决过类似问题的?帮下忙吧!再次谢过!

java doc转PDF
5分
什么版本的word?07的话要装一个插件SaveAsPDFandXPS,windows的。
java doc转PDF
我安装的版本是2010,那还需要安装插件吗

引用 1 楼 fangmingshijie 的回复:

什么版本的word?07的话要装一个插件SaveAsPDFandXPS,windows的。

java doc转PDF
是的。

引用 2 楼 simaweier 的回复:

我安装的版本是2010,那还需要安装插件吗

Quote: 引用 1 楼 fangmingshijie 的回复:

什么版本的word?07的话要装一个插件SaveAsPDFandXPS,windows的。

java doc转PDF
能不能写代码解决啊?总觉着这样安装插件的方式不是很好,还有您有这个插件吗?有的话能不能发个,邮箱:wen__3344@163.com(wen与3344之间有两个下划线)

引用 3 楼 fangmingshijie 的回复:

是的。

Quote: 引用 2 楼 simaweier 的回复:

我安装的版本是2010,那还需要安装插件吗

Quote: 引用 1 楼 fangmingshijie 的回复:

什么版本的word?07的话要装一个插件SaveAsPDFandXPS,windows的。

java doc转PDF
也可能不是这个原因,我下载了插件,安装上之后仍然存在这样的问题
java doc转PDF
还有没有遇到过这样的问题的同胞啊?给说一下呗!急切等到支援啊
java doc转PDF
5分
引用 6 楼 simaweier 的回复:

还有没有遇到过这样的问题的同胞啊?给说一下呗!急切等到支援啊

从头到尾,没看到你啥问题。报的异常呢?谁愿意一步步的问你

java doc转PDF
启动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: 命令失败


java doc转PDF
启动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: 命令失败
引用 7 楼 fangmingshijie 的回复:
Quote: 引用 6 楼 simaweier 的回复:

还有没有遇到过这样的问题的同胞啊?给说一下呗!急切等到支援啊

从头到尾,没看到你啥问题。报的异常呢?谁愿意一步步的问你

java doc转PDF
就是上述的方法,如果是单单写一个小程序。如下:

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);
	    }
	}

}

没有任何问题,不论执行多少遍。但是如果是走服务器就会出现上面的问题。

java doc转PDF
5分
jacob支持03office一点也不好。还是换用别的转换工具吧。
java doc转PDF
5分
我建议楼主还是用openoffice转换吧,安全的多。而且不像调用com转换这样只能一个一个来,不能并发,速度慢。
java doc转PDF
5分
引用 12 楼 yys79 的回复:

我建议楼主还是用openoffice转换吧,安全的多。而且不像调用com转换这样只能一个一个来,不能并发,速度慢。

openofficec好像转出来的效果不怎么好,微软word应该可以用acrobat控件来转的

java doc转PDF
5分
话说save as 转出来的pdf word里的图片感觉发虚,不知道可不可以通过调节参数什么的解决这个问题
java doc转PDF
  额也不知道

引用 14 楼 huzhongying 的回复:

话说save as 转出来的pdf word里的图片感觉发虚,不知道可不可以通过调节参数什么的解决这个问题

java doc转PDF
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查询控件
java doc转PDF
jacob,doc转PDF,多线程处理的效果是串行的,并非并行,提高不了效率,而OpenOffice转换虽然速度快,可有些内容转不出来,一般处理几个没问题,如果有几十上百个则save as与Close都可能有问题,试过多进程,可没法判断是否转换成功,因为有的即使没报错,也不一定成功了,想请教各位神们,有没有好的推荐与方法处理,不胜感激…
java doc转PDF
这人最后还是用的Jacob

引用 17 楼 tongbo0329 的回复:

jacob,doc转PDF,多线程处理的效果是串行的,并非并行,提高不了效率,而OpenOffice转换虽然速度快,可有些内容转不出来,一般处理几个没问题,如果有几十上百个则save as与Close都可能有问题,试过多进程,可没法判断是否转换成功,因为有的即使没报错,也不一定成功了,想请教各位神们,有没有好的推荐与方法处理,不胜感激…

java doc转PDF
Jacob 可以的啊。 07  03  都可以的。
java doc转PDF
10分
引用 17 楼 tongbo0329 的回复:

jacob,doc转PDF,多线程处理的效果是串行的,并非并行,提高不了效率,而OpenOffice转换虽然速度快,可有些内容转不出来,一般处理几个没问题,如果有几十上百个则save as与Close都可能有问题,试过多进程,可没法判断是否转换成功,因为有的即使没报错,也不一定成功了,想请教各位神们,有没有好的推荐与方法处理,不胜感激…

你可以试试不要close 只是不会输出文件,多个文件转换再关闭。类似实现批处理功能。转化多少个文件再close一次,然后重新打开资源。
很久之前试过,你可以尝试一下~ 而且当初转换的文件还超大,后来环节了一部分问题。
这种还有一个错误就是office会直接崩溃掉~ 程序会卡在那里,要手动点掉office弹窗错误才能继续走下去,这个基本上就是本地的office版本有问题。

java doc转PDF
顶一下,怕自己以后用到
java doc转PDF
5分
引用 20 楼 qqzhuping 的回复:
Quote: 引用 17 楼 tongbo0329 的回复:

jacob,doc转PDF,多线程处理的效果是串行的,并非并行,提高不了效率,而OpenOffice转换虽然速度快,可有些内容转不出来,一般处理几个没问题,如果有几十上百个则save as与Close都可能有问题,试过多进程,可没法判断是否转换成功,因为有的即使没报错,也不一定成功了,想请教各位神们,有没有好的推荐与方法处理,不胜感激…

你可以试试不要close 只是不会输出文件,多个文件转换再关闭。类似实现批处理功能。转化多少个文件再close一次,然后重新打开资源。
很久之前试过,你可以尝试一下~ 而且当初转换的文件还超大,后来环节了一部分问题。
这种还有一个错误就是office会直接崩溃掉~ 程序会卡在那里,要手动点掉office弹窗错误才能继续走下去,这个基本上就是本地的office版本有问题。

可不可以理解为你的意思是一个程序应用下打开多个word文档,再去转换,期间,当然也必须得是一个一个的转,我试过,貌似Office就是不支持多个一起并行的玩,至于你说的程序卡死的问题,这是很大的问题,如果进程卡死掉,那必须得Kill掉吧,因为规定必须得用JMS实现,所以实际上我的做法是,JMS发送要转换的文档信息,比如路径啥的,开启多个Receive消费者,用多进程的处理,每个进程转一个文档,效率肯定相比串行好多了,也相对还稳定点,不过仍然会有卡死进程的问题,此时应该Kill掉,再生成一个,可是因为生成的进程,进程名都是一样的,用java得到pid,虽然是做到了,可是通过代码启动的进程和手动启动,是有些微区别的,我要拿到这些区别,比较烦啊。。。

java doc转PDF
5分
引用 18 楼 simaweier 的回复:

这人最后还是用的Jacob

Quote: 引用 17 楼 tongbo0329 的回复:

jacob,doc转PDF,多线程处理的效果是串行的,并非并行,提高不了效率,而OpenOffice转换虽然速度快,可有些内容转不出来,一般处理几个没问题,如果有几十上百个则save as与Close都可能有问题,试过多进程,可没法判断是否转换成功,因为有的即使没报错,也不一定成功了,想请教各位神们,有没有好的推荐与方法处理,不胜感激…

没办法啊,一把辛酸泪, 毕竟Jacob调用ActiveX组件转换的效果还真是没得说的,客户需要,你懂的。。。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明java doc转PDF
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!