调用jacob服务时注意事项
需求有一个将office文件转成PDF并添加水印的功能,office转PDF需要用到jacob功能
转化代码
private static final int wdFormatPDF = 17; private static final int xlTypePDF = 0; private static final int ppSaveAsPDF = 32; private static final int msoTrue = -1; private static final int msofalse = 0; public static boolean word2PDF(String inputFile,String pdfFile){ try{ ComThread.InitSTA(); //打开word应用程序 ActiveXComponent app = new ActiveXComponent("Word.Application"); //设置word不可见 app.setProperty("Visible", false); //获得word中所有打开的文档,返回Documents对象 Dispatch docs = app.getProperty("Documents").toDispatch(); //调用Documents对象中Open方法打开文档,并返回打开的文档对象Document Dispatch doc = Dispatch.call(docs, "Open", inputFile, false, true ).toDispatch(); //调用Document对象的SaveAs方法,将文档保存为pdf格式 /* Dispatch.call(doc, "SaveAs", pdfFile, wdFormatPDF //word保存为pdf格式宏,值为17 ); */ Dispatch.call(doc, "ExportAsFixedFormat", pdfFile, wdFormatPDF //word保存为pdf格式宏,值为17 ); //关闭文档 Dispatch.call(doc, "Close",false); //关闭word应用程序 app.invoke("Quit", 0); return true; }catch(Exception e){ e.printStackTrace(); return false; }finally{ ComThread.Release(); } } public static boolean excel2PDF(String inputFile,String pdfFile){ try{ ComThread.InitSTA(); ActiveXComponent app = new ActiveXComponent("Excel.Application"); app.setProperty("DisplayAlerts", "False"); app.setProperty("Visible", false); Dispatch excels = app.getProperty("Workbooks").toDispatch(); Dispatch excel = Dispatch.call(excels, "Open", inputFile, false, true ).toDispatch(); Dispatch.call(excel, "ExportAsFixedFormat", xlTypePDF, pdfFile ); Dispatch.call(excel, "Close",false); app.invoke("Quit"); return true; }catch(Exception e){ e.printStackTrace(); return false; }finally{ ComThread.Release(); } } public static boolean ppt2PDF(String inputFile,String pdfFile){ try{ ComThread.InitSTA(); ActiveXComponent app = new ActiveXComponent("PowerPoint.Application"); //app.setProperty("Visible", msofalse); Dispatch ppts = app.getProperty("Presentations").toDispatch(); Dispatch ppt = Dispatch.call(ppts, "Open", inputFile, true,//ReadOnly true,//Untitled指定文件是否有标题 false//WithWindow指定文件是否可见 ).toDispatch(); Dispatch.call(ppt, "SaveAs", pdfFile, ppSaveAsPDF ); Dispatch.call(ppt, "Close"); app.invoke("Quit"); return true; }catch(Exception e){ return false; }finally{ ComThread.Release(); } }
这个是网上找到的功能,的确可以实现需求,但是有很明显的缺陷。
代码转化完后会打开一个进程,但是结束时却不会主动开闭,导致内存占用最终崩溃。
所以要在 每个方法前 加上
ComThread.InitSTA();
结束加上
ComThread.Release(); //释放进程
1. 注意事项
2.1 注意使用高版本的ofiice,建议office2010.
2.2启动office的打印服务
将office打印设置为系统默认
2.3 由于高本版的office经常将excel自动设置为受保护的视图,需要解除文件状态
Excel文件 文件—选项—信任中心—信任中心设置—受信任的位置–添加新位置(可能涉及到需要用到的文件的地方,例如tomcat文件夹和文件上传目录)
2.4 服务启动的tomcat使用jacob组件时要设置 DOCM权限,否则用不了。Tomcat catalina方式启动或者main方式启动不会有这个问题。
运行输入 comexp.msc -32
找到 office Excel 和word ,右键属性
标识—交互式用户
安全–配置权限 –编辑
将所有权限勾上