java word转pdf jacob_jacob调用office实现word文件转pdf文件的过程(完美格式和图片、兼容docx)...

本文介绍了如何使用Java库jacob将word文档转换为pdf,包括详细步骤、所需环境、代码实现及解决遇到的问题。通过jacob调用Office实现格式保留,适合对格式要求高的场景。
摘要由CSDN通过智能技术生成

一、实现的思路

当接到任务的时候,首先这是个陌生的领域,所以先度娘一下再搬砖。一开始我是想用poi把word转成html(原项目就导有poi的包,各种excel,word操作),然后用jsoup解析一下(原项目就用到jsoup包),再用Itext转成pdf(jar包都下载好了= =)。但是当我看到生成的html效果,我就放弃了……格式只保留的基本的雏形,什么分页符啊换行的说丢就丢了,这很致命,因为我们做的不是预览而已,客户对格式的要求是最重要的。目前还未能找到纯java对格式完美支持的备用方案,希望大神赐教…

通过度娘找到一种调用office的方法,jacob!这种方式能实现完美保留word格式,而且速度不还算慢,2页4秒,第一次生成后存为附件后面就可以n次愉快地下载了。但是这个方法也不是完全顺利,后面遇到一些奇葩问题度娘了很多都是无效的,所以决定总结一下。后续如果项目有问题还会继续更新此文!

二、准备

1、服务器环境:64位window sserver 2012、win10 操作系统

jdk1.6+tomcat7.x、jdk1.8+tomcat9.0.11

均是64位。

开发工具是myeclipse2017

2、java用到的jar包:jacob-1.18(据说低版本的连jdk1.6都不支持)

3、服务器要安装:office2007及以上(32或64位的2010、2013版本均通过)

4、dl文件:jacob-1.18-x64.dll、jacob-1.18-x86.dll

要放到...Javajdk1.8.0_181jrebin下,放到jdk下面的Bin会不兼容

Jar包和dll文件在附件!

三、代码

public void convertWordToPdf(String wordFile,String pdfRoot, String pdfName) throws Exception {

File file = new File(wordFile);

String pdfFile = pdfRoot + File.separator + pdfName;

if(file.exists()){

if (!file.isDirectory()) { //判断word文件存不存在

//创建Pdf目录

File pdfBase = new File(pdfRoot);

if(!pdfBase.exists()){

pdfBase.mkdir();

}

ActiveXComponent app = null;

System.out.println("============开始转换============");

// 开始时间

long start = System.currentTimeMillis();

try {

//新增优化代码==============>初始化com的线程

// ComThread.InitSTA(); 仅允许线程池里面的一个线程执行,其他线程都被锁住

ComThread.InitMTA(true); //允许同时有多个WORD进程运行

// 打开word

app = new ActiveXComponent("Word.Application");

// 设置word不可见

//app.setProperty("Visible", false);

// 获得所有打开的文档

Dispatch documents = app.getProperty("Documents").toDispatch();

System.out.println("============打开文件: " + wordFile);

// 打开文档

Dispatch document = Dispatch.call(documents, "Open", wordFile, false, true).toDispatch();

// 判断文件是否存在

File target = new File(pdfFile);

if (target.exists()) {

target.delete();

}

System.out.println("============另存为: " + pdfFile);

// 另存为,将文档报错为pdf,其中word保存为pdf的格式宏的值是17

Dispatch.call(document, "SaveAs", pdfFile, 17);

// 关闭文档

Dispatch.call(document, "Close", false);

// 结束时间

long end = System.currentTimeMillis();

System.out.println("============转换结束:" + (end - start) + "ms");

}catch(Exception e) {

logger.error("pdf转换发生异常convertWordToPdf:"+e.getLocalizedMessage());

throw new RuntimeException("pdf转换失败!请联系技术人员。");

}finally {

// 关闭office

if (app != null) {

app.invoke("Quit", new Variant[] {});

}

//新增优化代码==============>关闭com的线程

ComThread.Release();

}

}

}

}

四、遇到的问题

1、项目启动不了

刚开始把dll放到jdk下面的Bin了,改放jdk里面的jrebin

2、第一次部署:com.jacob.com.ComFailException: Can't co-create object

因为本地office默认就是交互性的,部署到正式环境就报错,解决办法:

打开任务管理器,32位系统输入”dcomcnfg”,64位输入 mmc comexp.msc 然后回车展开:“控制台–>“组件服务”–>”计算机”–>“我的电脑”–>”DCOM配置”,找到一个名字类似为”Microsoft Office 97-2003"的节点右键单击该节点,选属性 ->标识选项卡,改为“交互式用户”,最后点击确定完成。

3、后来虽然功能没问题,但是不稳定,时不时报错Can't co-create object

亲测无效的方法:请注意是无效!!!!!!!!!

1)C:WindowsSysWOW64configsystemprofile目录下新建一个Desktop的文件夹

2)在System32下面也放dll文件

3)注册dll服务等等

后来发现只要报错我就远程连接服务器看问题,然后功能就没问题!关掉远程就不行!看来交互性配置只适用于本地跑项目啊

真的解决方法:

感谢的博客:

java将doc文件转换为pdf文件的三种方法(比较)

http://feifei.im/archives/93

POI转html报jar包错误

http://m.360sdn.com/java/2017/0119/13273.html

Jacob在服务器上不能使用的解决方法

https://blog.csdn.net/qq_31757133/article/details/52089212

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值