java使用jacob实现word转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代码如下:
net.sf.jacob-project jacob 1.14.3
4.假如通过以上准备工作未成功转换,就下载一个SaveAsPDFandXPS.exe组件(office2007里的)。我就是通过这个组件才完成转换。
5.上面的在系统为windows7中就可以了,假如你的项目需要发布到服务器(服务器系统一般都是windows2008)。则还需要一步。在上面的基础上再安装安装jacob-1.14.3-x64.dll到jdk\jdk1.7.0\jre\bin(你自己电脑安装的jdk)中。很多人在win7下都能成功转换,但在win2008就是出问题。我就是通过磨了一天的时间,看了各种日志才发现问题。
一、工具类(OperationIo.java),这里面可以不做任何修改,复制粘贴就可以了。
packagecom.repair.util.pub; importjava.awt.image.BufferedImage; importjava.io.ByteArrayInputStream; importjava.io.File; importjava.io.FileInputStream; importjava.io.IOException; importjava.io.InputStream; importjavax.imageio.ImageIO; importsun.misc.BASE64Decoder; importsun.misc.BASE64Encoder; importcom.jacob.activeX.ActiveXComponent; importcom.jacob.com.ComThread; importcom.jacob.com.Dispatch; importcom.jacob.com.Variant; publicclassOperationIO{ staticfinalintwdFormatPDF=17;//PDF格式 /** *WORD转换PDF *@paramsfileNameWORD文件存在位置 *@paramtoFileNamePDF文件存放位置 */ publicstaticvoidwordToPDF(StringsfileName,StringtoFileName){ System.out.println("启动Word..."); longstart=System.currentTimeMillis(); ActiveXComponentapp=null; Dispatchdoc=null; try{ //调用officeword app=newActiveXComponent("Word.Application"); app.setProperty("Visible",newVariant(false)); Dispatchdocs=app.getProperty("Documents").toDispatch(); doc=Dispatch.call(docs,"Open",sfileName).toDispatch(); System.out.println("打开文档..."+sfileName); System.out.println("转换文档到PDF..."+toFileName); Filetofile=newFile(toFileName); if(tofile.exists()){ tofile.delete(); } Dispatch.call(doc, "SaveAs", toFileName,//FileName wdFormatPDF); longend=System.currentTimeMillis(); System.out.println("转换完成..用时:"+(end-start)+"ms."); }catch(Exceptione){ System.out.println("========Error:文档转换失败:"+e.getMessage()); }finally{ Dispatch.call(doc,"Close",false); System.out.println("关闭文档"); if(app!=null) app.invoke("Quit",newVariant[]{}); } //如果没有这句话,winword.exe进程将不会关闭 ComThread.Release(); } /** *递归删除目录下的所有文件及子目录下所有文件 *@paramdir将要删除的文件目录 *@returnbooleanReturns"true"ifalldeletionsweresuccessful. *Ifadeletionfails,themethodstopsattemptingto *deleteandreturns"false". */ publicstaticbooleandeleteDir(Filedir){ if(dir.isDirectory()){ String[]children=dir.list(); for(inti=0;i二、业务类(PrintWordToPdf.java),这里
packagecom.hjm.Test; importjava.io.BufferedWriter; importjava.io.File; importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.OutputStreamWriter; importjava.io.UnsupportedEncodingException; importjava.io.Writer; importjava.util.HashMap; importjava.util.Map; importcom.engineering.pojos.pub.gcRecordArchive; importcom.repair.util.pub.OperationIO; importfreemarker.template.Configuration; importfreemarker.template.Template; importfreemarker.template.TemplateException; publicclassPrintWordToPdf{ publicstaticvoidmain(String[]args){ //创建一个Configuration的实例 Configurationconfiguration=newConfiguration(); //设置编码 configuration.setDefaultEncoding("utf-8"); //创建Map对象,来保存要填写的数据 MapparaMap=newHashMap (); //下面这些是我测试的一些数据 paraMap.put("ReceivingParty","中国民航"); paraMap.put("PackingListNo",10087); paraMap.put("ConNo",10088); try{ //调用模板的文件夹,newFile("D:\\测试")是一个绝对路径,你可以自己设置为服务器路径。 configuration.setDirectoryForTemplateLoading(newFile("D:\\测试")); }catch(IOExceptione){ e.printStackTrace(); } Templatet=null; try{ //获取模板文件 t=configuration.getTemplate("FMO-08PackingList.ftl");//获取模板文件 }catch(IOExceptione){ e.printStackTrace(); } //生成一个文件保存的文件夹 Filefile=newFile("D:\\最终"); //判断文件夹是否存在,存在删除并重创 if(!file.exists()&&!file.isDirectory()) { file.mkdir(); }else { booleanb=OperationIO.deleteDir(file); if(b){ file.mkdir(); } } //填写数据后生成的word文件。 Stringoutfilepath="D:/最终\\结果"+".doc"; FileoutFile=newFile(outfilepath);//导出文件 Writerout=null; try{ try{ out=newBufferedWriter(newOutputStreamWriter( newFileOutputStream(outFile),"utf-8")); }catch(UnsupportedEncodingExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } }catch(FileNotFoundExceptione1){ e1.printStackTrace(); } try{ t.process(paraMap,out);//将填充数据填入模板文件并输出到目标文件 out.flush(); out.close(); //转换PDF的文件 OperationIO.wordToPDF(outfilepath,"D:/最终\\结果"+".pdf"); }catch(TemplateExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } } 总结:通过以上代码,就可以在模板中填写好数据,并将其生成word文件与其pdf文件。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。