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文件。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。