java使用jacob实现word转pdf
程序员文章站
2024-03-03 22:10:04
背景:日常开发erp系统,会有一些工单或者合同之类需要填写打印。我们就会将其word模板来通过系统自动化填写并转换为pdf格式(pdf文件打印可保证文件质量,是一种通用的格...
背景:日常开发erp系统,会有一些工单或者合同之类需要填写打印。我们就会将其word模板来通过系统自动化填写并转换为pdf格式(pdf文件打印可保证文件质量,是一种通用的格式。文件不易去修改,比较稳定)。所以我们将通过jacob来实现这些功能。
准备工作:
1.服务器需要安装office2007,因为我们就是调用这个来实现转换。
2.需要安装插件jacob,安装jacob-1.14.3-x86.dll到jdk\jdk1.7.0\jre\bin(你自己电脑安装的jdk)
3.需要使用jacob-1.14.3.jar包
maven代码如下:
<dependency> <groupid>net.sf.jacob-project</groupid> <artifactid>jacob</artifactid> <version>1.14.3</version> </dependency>
4.假如通过以上准备工作未成功转换,就下载一个saveaspdfandxps.exe组件(office2007里的)。我就是通过这个组件才完成转换。
5.上面的在系统为windows7中就可以了,假如你的项目需要发布到服务器(服务器系统一般都是windows2008)。则还需要一步。在上面的基础上再安装安装jacob-1.14.3-x64.dll到jdk\jdk1.7.0\jre\bin(你自己电脑安装的jdk)中。很多人在win7下都能成功转换,但在win2008就是出问题。我就是通过磨了一天的时间,看了各种日志才发现问题。
一、工具类(operationio.java),这里面可以不做任何修改,复制粘贴就可以了。
package com.repair.util.pub; import java.awt.image.bufferedimage; import java.io.bytearrayinputstream; import java.io.file; import java.io.fileinputstream; import java.io.ioexception; import java.io.inputstream; import javax.imageio.imageio; import sun.misc.base64decoder; import sun.misc.base64encoder; import com.jacob.activex.activexcomponent; import com.jacob.com.comthread; import com.jacob.com.dispatch; import com.jacob.com.variant; public class operationio { static final int wdformatpdf = 17;// pdf 格式 /** * word转换pdf * @param sfilename word文件存在位置 * @param tofilename pdf文件存放位置 */ public static void wordtopdf(string sfilename,string tofilename){ system.out.println("启动word..."); long start = system.currenttimemillis(); activexcomponent app = null; dispatch doc = null; try { //调用office word app = new activexcomponent("word.application"); app.setproperty("visible", new variant(false)); dispatch docs = app.getproperty("documents").todispatch(); doc = dispatch.call(docs, "open" , sfilename).todispatch(); system.out.println("打开文档..." + sfilename); system.out.println("转换文档到pdf..." + tofilename); file tofile = new file(tofilename); if (tofile.exists()) { tofile.delete(); } dispatch.call(doc, "saveas", tofilename, // filename wdformatpdf); long end = system.currenttimemillis(); system.out.println("转换完成..用时:" + (end - start) + "ms."); } catch (exception e) { system.out.println("========error:文档转换失败:" + e.getmessage()); } finally { dispatch.call(doc,"close",false); system.out.println("关闭文档"); if (app != null) app.invoke("quit", new variant[] {}); } //如果没有这句话,winword.exe进程将不会关闭 comthread.release(); } /** * 递归删除目录下的所有文件及子目录下所有文件 * @param dir 将要删除的文件目录 * @return boolean returns "true" if all deletions were successful. * if a deletion fails, the method stops attempting to * delete and returns "false". */ public static boolean deletedir(file dir) { if (dir.isdirectory()) { string[] children = dir.list(); for (int i=0; i<children.length; i++) { boolean success = deletedir(new file(dir, children[i])); if (!success) { return false; } } } // 目录此时为空,可以删除 return dir.delete(); } /** * 将图片文件转化为字节数组字符串,并对其进行base64编码处理 * @param imgfilepath 图片地址路径 */ public static string getimagestr(string imgfilepath) {// byte[] data = null; // 读取图片字节数组 try { inputstream in = new fileinputstream(imgfilepath); data = new byte[in.available()]; in.read(data); in.close(); } catch (ioexception e) { e.printstacktrace(); } // 对字节数组base64编码 base64encoder encoder = new base64encoder(); return encoder.encode(data);// 返回base64编码过的字节数组字符串 } /** * 将二进制转换为图片 * * @param base64string */ public static void base64stringtoimage(string base64string,string imageoutpath) { try { base64decoder decoder = new sun.misc.base64decoder(); byte[] bytes1 = decoder.decodebuffer(base64string); bytearrayinputstream bais = new bytearrayinputstream(bytes1); bufferedimage bi1 = imageio.read(bais); file w2 = new file(imageoutpath);// 可以是jpg,png,gif格式 imageio.write(bi1, "jpg", w2);// 不管输出什么格式图片,此处不需改动 } catch (ioexception e) { e.printstacktrace(); } } }
二、业务类(printwordtopdf.java) ,这里
package com.hjm.test; import java.io.bufferedwriter; import java.io.file; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import java.io.outputstreamwriter; import java.io.unsupportedencodingexception; import java.io.writer; import java.util.hashmap; import java.util.map; import com.engineering.pojos.pub.gcrecordarchive; import com.repair.util.pub.operationio; import freemarker.template.configuration; import freemarker.template.template; import freemarker.template.templateexception; public class printwordtopdf { public static void main(string[] args) { //创建一个configuration的实例 configuration configuration = new configuration(); //设置编码 configuration.setdefaultencoding("utf-8"); //创建map对象,来保存要填写的数据 map<string, object> paramap = new hashmap<string, object>(); //下面这些是我测试的一些数据 paramap.put("receivingparty", "中国民航"); paramap.put("packinglistno", 10087); paramap.put("conno", 10088); try { //调用模板的文件夹,new file("d:\\测试")是一个绝对路径,你可以自己设置为服务器路径。 configuration.setdirectoryfortemplateloading(new file("d:\\测试")); } catch (ioexception e) { e.printstacktrace(); } template t = null; try { //获取模板文件 t = configuration.gettemplate("fmo-08 packing list.ftl"); // 获取模板文件 } catch (ioexception e) { e.printstacktrace(); } //生成一个文件保存的文件夹 file file =new file("d:\\最终"); //判断文件夹是否存在,存在删除并重创 if (!file .exists() && !file .isdirectory()) { file.mkdir(); } else { boolean b = operationio.deletedir(file); if(b){ file.mkdir(); } } //填写数据后生成的word文件。 string outfilepath = "d:/最终\\结果"+".doc"; file outfile = new file(outfilepath); // 导出文件 writer out = null; try { try { out = new bufferedwriter(new outputstreamwriter( new fileoutputstream(outfile),"utf-8")); } catch (unsupportedencodingexception e) { // todo auto-generated catch block e.printstacktrace(); } } catch (filenotfoundexception e1) { e1.printstacktrace(); } try { t.process(paramap,out); // 将填充数据填入模板文件并输出到目标文件 out.flush(); out.close(); //转换pdf的文件 operationio.wordtopdf(outfilepath,"d:/最终\\结果"+".pdf"); } catch (templateexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } } }
总结:通过以上代码,就可以在模板中填写好数据,并将其生成word文件与其pdf文件。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。