1.前言
MS Office2010是可以的,理论上2007版本也可以,博主没试过;
Wps2015是可以的,理论上Wps2016也能用,Wps理论上还兼容MS Office的相关代码,有时间的可以试试;
Wps和Ms Office都需要导入jacob-1.18.jar包,以及将jacob-1.18-x64.dll或者jacob-1.18-x64.dll放置到jdk的bin目录(或者windows的System32/SysWoW64目录下)
而OpenOffice需要导入jodconverter-2.2.1.jar等相关包;
相关包的下载链接,包含实现代码:http://download.csdn.net/detail/huitoukest/9506740
包中的代码可能没有捕获NoClassDefFoundError异常和,建议使用者自行捕获;
2.MS Office2010
核心代码如下:
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; /** * @return 操作成功与否的提示信息. 如果返回 -1, 表示找不到源文件, 或url.properties配置错误; 如果返回 0, * 则表示操作成功; 返回1, 则表示转换失败 */ @Override public int officeToPdf(OfficeToPDFInfo officeToPDFInfo) { String sourceFile=officeToPDFInfo.sourceUrl; String destFile=officeToPDFInfo.destUrl; File inputFile = new File(sourceFile); if (!inputFile.exists()) { return -1;// 找不到源文件, 则返回-1 } // 如果目标路径不存在, 则新建该路径 File outputFile = new File(destFile); if (!outputFile.getParentFile().exists()) { outputFile.getParentFile().mkdirs(); } String extentionName=FileUtils.getFileExtension(sourceFile); if(extentionName.equalsIgnoreCase("ppt")||extentionName.equalsIgnoreCase("pptx")) { ppt2pdf(officeToPDFInfo.sourceUrl,officeToPDFInfo.destUrl); }else if(extentionName.equalsIgnoreCase("doc")||extentionName.equalsIgnoreCase("docx")){ doc2pdf(officeToPDFInfo.sourceUrl,officeToPDFInfo.destUrl); }else if(extentionName.equalsIgnoreCase("xls")||extentionName.equalsIgnoreCase("xlsx")){ excel2PDF(officeToPDFInfo.sourceUrl,officeToPDFInfo.destUrl); } return 0; } protected static boolean doc2pdf(String srcFilePath, String pdfFilePath) { ActiveXComponent app = null; Dispatch doc = null; try { ComThread.InitSTA(); app = new ActiveXComponent("Word.Application"); app.setProperty("Visible", false); Dispatch docs = app.getProperty("Documents").toDispatch(); doc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[] { srcFilePath, new Variant(false), new Variant(true),//是否只读 new Variant(false), new Variant("pwd") }, new int[1]).toDispatch(); // Dispatch.put(doc, "Compatibility", false); //兼容性检查,为特定值false不正确 Dispatch.put(doc, "RemovePersonalInformation", false); Dispatch.call(doc, "ExportAsFixedFormat", pdfFilePath,wdFormatPDF); // word保存为pdf格式宏,值为17 return true; // set flag true; }finally { if (doc != null) { Dispatch.call(doc, "Close", false); } if (app != null) { app.invoke("Quit", 0); } ComThread.Release(); } } protected static boolean ppt2pdf(String srcFilePath, String pdfFilePath) { ActiveXComponent app = null; Dispatch ppt = null; try { ComThread.InitSTA(); app = new ActiveXComponent("PowerPoint.Application"); Dispatch ppts = app.getProperty("Presentations").toDispatch(); // 因POWER.EXE的发布规则为同步,所以设置为同步发布 ppt = Dispatch.call(ppts, "Open", srcFilePath, true,// ReadOnly true,// Untitled指定文件是否有标题 false// WithWindow指定文件是否可见 ).toDispatch(); Dispatch.call(ppt, "SaveAs", pdfFilePath, ppSaveAsPDF); //ppSaveAsPDF为特定值32 return true; // set flag true; }finally { if (ppt != null) { Dispatch.call(ppt, "Close"); } if (app != null) { app.invoke("Quit"); } ComThread.Release(); } } public static boolean excel2PDF(String inputFile,String pdfFile){ ActiveXComponent app=null; Dispatch excel =null; try{ ComThread.InitSTA(); app = new ActiveXComponent("Excel.Application"); app.setProperty("Visible", false); Dispatch excels = app.getProperty("Workbooks").toDispatch(); excel = Dispatch.call(excels,"Open",inputFile, false,true).toDispatch(); Dispatch.call(excel,"ExportAsFixedFormat", xlTypePDF,pdfFile); return true; }finally{ if (excel!= null) { Dispatch.call(excel, "Close"); } if (app != null) { app.invoke("Quit"); } ComThread.Release(); } }
2.Wps 2015
核心代码如下:
public final static String WORDSERVER_STRING="KWPS.Application"; public final static String PPTSERVER_STRING="KWPP.Application"; public final static String EXECLSERVER_STRING="KET.Application"; private static final int wdFormatPDF = 17; private static final int xlTypePDF = 0; private static final int ppSaveAsPDF = 32; /** * @return 操作成功与否的提示信息. 如果返回 -1, 表示找不到源文件, 或url.properties配置错误; 如果返回 0, * 则表示操作成功; 返回1, 则表示转换失败 */ @Override public int officeToPdf(OfficeToPDFInfo officeToPDFInfo) { String sourceFile=officeToPDFInfo.sourceUrl; String destFile=officeToPDFInfo.destUrl; File inputFile = new File(sourceFile); if (!inputFile.exists()) { return -1;// 找不到源文件, 则返回-1 } // 如果目标路径不存在, 则新建该路径 File outputFile = new File(destFile); if (!outputFile.getParentFile().exists()) { outputFile.getParentFile().mkdirs(); } String extentionName=FileUtils.getFileExtension(sourceFile); if(extentionName.equalsIgnoreCase("ppt")||extentionName.equalsIgnoreCase("pptx")||extentionName.equalsIgnoreCase("wpt")) { ppt2pdf(officeToPDFInfo.sourceUrl,officeToPDFInfo.destUrl); }else if(extentionName.equalsIgnoreCase("doc")||extentionName.equalsIgnoreCase("docx")||extentionName.equalsIgnoreCase("wps")){ doc2pdf(officeToPDFInfo.sourceUrl,officeToPDFInfo.destUrl); }else if(extentionName.equalsIgnoreCase("xls")||extentionName.equalsIgnoreCase("xlsx")||extentionName.equalsIgnoreCase("et")){ excel2PDF(officeToPDFInfo.sourceUrl,officeToPDFInfo.destUrl); } return 0; } protected static boolean doc2pdf(String srcFilePath, String pdfFilePath) { ActiveXComponent pptActiveXComponent=null; ActiveXComponent workbook = null; try { ComThread.InitSTA();//初始化COM线程 pptActiveXComponent = new ActiveXComponent(WORDSERVER_STRING);//初始化exe程序 Variant[] openParams=new Variant[]{ new Variant(srcFilePath),//filePath new Variant(true), new Variant(true)//readOnley }; workbook = pptActiveXComponent.invokeGetComponent("Documents").invokeGetComponent ("Open",openParams); workbook.invoke("SaveAs",new Variant(pdfFilePath),new Variant(wdFormatPDF)); return true; }finally{ if(workbook!=null) { workbook.invoke("Close"); workbook.safeRelease(); } if(pptActiveXComponent!=null) { pptActiveXComponent.invoke("Quit"); pptActiveXComponent.safeRelease(); } ComThread.Release(); } } protected static boolean ppt2pdf(String srcFilePath, String pdfFilePath) { ActiveXComponent pptActiveXComponent=null; ActiveXComponent workbook = null; boolean readonly = true; try { ComThread.InitSTA();//初始化COM线程 pptActiveXComponent = new ActiveXComponent(PPTSERVER_STRING);//初始化exe程序 workbook = pptActiveXComponent.invokeGetComponent("Presentations").invokeGetComponent ("Open",new Variant(srcFilePath),new Variant(readonly)); workbook.invoke("SaveAs",new Variant(pdfFilePath),new Variant(ppSaveAsPDF)); return true; }finally{ if(workbook!=null) { workbook.invoke("Close"); workbook.safeRelease(); } if(pptActiveXComponent!=null) { pptActiveXComponent.invoke("Quit"); pptActiveXComponent.safeRelease(); } ComThread.Release(); } } public static boolean excel2PDF(String srcFilePath,String pdfFilePath){ ActiveXComponent et = null; Dispatch workbooks = null; Dispatch workbook = null; ComThread.InitSTA();//初始化COM线程 //ComThread.InitSTA(true); try { et = new ActiveXComponent(EXECLSERVER_STRING);//初始化et.exe程序 et.setProperty("Visible", new Variant(false)); workbooks = et.getProperty("Workbooks").toDispatch(); //workbook = Dispatch.call(workbooks, "Open", filename).toDispatch();//这一句也可以的 workbook = Dispatch.invoke(workbooks,"Open",Dispatch.Method,new Object[]{srcFilePath,0,true},new int[1]).toDispatch(); //Dispatch.invoke(workbook,"SaveAs",Dispatch.Method,new Object[]{pdfFilePath,xlTypePDF},new int[1]); Dispatch.call(workbook,"ExportAsFixedFormat",new Object[]{xlTypePDF,pdfFilePath}); return true; }finally{ if(workbook!=null) { Dispatch.call(workbook,"Close"); workbook.safeRelease(); } if(et!=null) { et.invoke("Quit"); et.safeRelease(); } ComThread.Release(); } }
3.OpenOffice4.X
public int officeToPdf(OfficeToPDFInfo officeToPDFInfo) throws IOException { String sourceFile=officeToPDFInfo.sourceUrl; String destFile=officeToPDFInfo.destUrl; String OpenOffice_HOME=officeToPDFInfo.openOfficeHOME; File inputFile = new File(sourceFile); if (!inputFile.exists()) { return -1;// 找不到源文件, 则返回-1 } // 如果目标路径不存在, 则新建该路径 File outputFile = new File(destFile); if (!outputFile.getParentFile().exists()) { outputFile.getParentFile().mkdirs(); } //= "D:\\Program Files\\OpenOffice.org 3";//这里是OpenOffice的安装目录, 在我的项目中,为了便于拓展接口,没有直接写成这个样子,但是这样是绝对没问题的 // 如果从文件中读取的URL地址最后一个字符不是 '\',则添加'\' if (OpenOffice_HOME.charAt(OpenOffice_HOME.length() - 1) != '\\') { OpenOffice_HOME += "\\"; } // 启动OpenOffice的服务 String command = OpenOffice_HOME + "program\\soffice.exe -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;StarOffice.ServiceManager\" -nofirststartwizard"; Process pro = Runtime.getRuntime().exec(command); // connect to an OpenOffice.org instance running on port 8100 OpenOfficeConnection connection = new SocketOpenOfficeConnection( "127.0.0.1", 8100); connection.connect(); // convert DocumentConverter converter = new OpenOfficeDocumentConverter(connection); //DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection); converter.convert(inputFile, outputFile); // close the connection connection.disconnect(); // 关闭OpenOffice服务的进程 pro.destroy(); return 0; }