Java使用jacob將微軟office中word、excel、ppt轉(zhuǎn)成pdf
本文實(shí)例為大家分享了Java使用jacob將微軟office文檔轉(zhuǎn)成pdf的具體代碼,供大家參考,具體內(nèi)容如下
在使用jacb前,我們需要去下載 jacob.jar 和 jacob-1.18-x64.dll
其次,我們需要將jacob-1.18-x64.dll放入到j(luò)dk的bin目錄下才可以使用
第三,使用jacb之前,我們需要確保office能正常使用
如果你現(xiàn)在使用的是maven工程,那么不好意思,現(xiàn)在還沒(méi)有發(fā)布正式的jacb資源文件,我們需要自定的maven依賴(lài),如下:
<dependency> <groupId>com.jacob</groupId> <artifactId>jacob</artifactId> <version>1.7</version> <scope>system</scope> <systemPath>${basedir}/../fileConvertApp/src/main/webapp/WEB-INF/lib/jacob.jar</systemPath> </dependency>
然后需要注意的是jar的地址,需要根據(jù)自己的情況修改
接下來(lái)我們貼一下具體使用的代碼片段
import java.io.File; import org.apache.log4j.Logger; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; /** * Converter Util * * @author Jason * */ public class OfficeConverterUtil { /** * log */ private static Logger logger = Logger.getLogger(OfficeConverterUtil.class); private static final int WDFO_RMATPDF = 17; private static final int XLTYPE_PDF = 0; private static final int PPT_SAVEAS_PDF = 32; public static final int WORD_HTML = 8; public static final int WORD_TXT = 7; public static final int EXCEL_HTML = 44; public static final int PPT_SAVEAS_JPG = 17; // private static final int msoTrue = -1; // private static final int msofalse = 0; /** * @param argInputFilePath * @param argPdfPath * @return */ public static boolean officeFileConverterToPdf(String argInputFilePath, String argPdfPath) { if (argInputFilePath.isEmpty() || argPdfPath.isEmpty() || getFileSufix(argInputFilePath).isEmpty()) { logger.debug("輸入或輸出文件路徑有誤!"); return false; } String suffix = getFileSufix(argInputFilePath); File file = new File(argInputFilePath); if (!file.exists()) { logger.debug("文件不存在!"); return false; } // PDF如果不存在則創(chuàng)建文件夾 file = new File(getFilePath(argPdfPath)); if (!file.exists()) { file.mkdir(); } // 如果輸入的路徑為PDF 則生成失敗 if (suffix.equals("pdf")) { System.out.println("PDF not need to convert!"); return false; } if (suffix.equals("doc") || suffix.equals("docx") || suffix.equals("txt")) { return wordToPDF(argInputFilePath, argPdfPath); } else if (suffix.equals("xls") || suffix.equals("xlsx")) { return excelToPdf(argInputFilePath, argPdfPath); } else if (suffix.equals("ppt") || suffix.equals("pptx")) { return pptToPdf(argInputFilePath, argPdfPath); // return ppt2PDF(argInputFilePath, argPdfPath); } return false; } /** * converter word to pdf * * @param wordPath * @param pdfPath * @return */ public static boolean wordToPDF(String wordPath, String pdfPath) { ActiveXComponent msWordApp = new ActiveXComponent("Word.Application"); msWordApp.setProperty("Visible", new Variant(false)); Dispatch docs = Dispatch.get(msWordApp, "Documents").toDispatch(); // long pdfStart = System.currentTimeMillis(); Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[] { wordPath, new Variant(false), new Variant(true) }, new int[1]).toDispatch(); deletePdf(pdfPath); Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] { pdfPath, new Variant(WDFO_RMATPDF) }, new int[1]); // long pdfEnd = System.currentTimeMillis(); logger.debug(wordPath + ",pdf轉(zhuǎn)換完成.."); if (null != doc) { Dispatch.call(doc, "Close", false); } return true; } /** * excel to pdf * * @param inputFile * @param pdfFile * @return */ public static boolean excelToPdf(String inputFile, String pdfFile) { ActiveXComponent activeXComponent = new ActiveXComponent("Excel.Application"); activeXComponent.setProperty("Visible", false); deletePdf(pdfFile); Dispatch excels = activeXComponent.getProperty("Workbooks").toDispatch(); Dispatch excel = Dispatch.call(excels, "Open", inputFile, false, true).toDispatch(); Dispatch.call(excel, "ExportAsFixedFormat", XLTYPE_PDF, pdfFile); Dispatch.call(excel, "Close", false); activeXComponent.invoke("Quit"); return true; } /** * ppt to pdf * * @param inputFile * @param pdfFile * @return */ public static boolean pptToPdf(String inputFile, String pdfFile) { // ComThread.InitSTA(); ActiveXComponent activeXComponent = new ActiveXComponent("PowerPoint.Application"); // activeXComponent.setProperty("Visible", new Variant(false)); Dispatch ppts = activeXComponent.getProperty("Presentations").toDispatch(); deletePdf(pdfFile); Dispatch ppt = Dispatch.call(ppts, "Open", inputFile, false, // ReadOnly true, // Untitled指定文件是否有標(biāo)題 true// WithWindow指定文件是否可見(jiàn) ).toDispatch(); // Dispatch ppt = Dispatch.invoke(ppts, "Open", Dispatch.Method, new Object[] { inputFile, new Variant(false), new Variant(true) }, new int[1]).toDispatch(); // Dispatch.call(ppt, "SaveAs", pdfFile, PPT_SAVEAS_PDF); // Dispatch.call(ppt, "SaveAs", pdfFile, new Variant(PPT_SAVEAS_PDF)); // Dispatch.call(ppt, "SaveAs", pdfFile, new Variant(PPT_SAVEAS_PDF)); // Dispatch.invoke(ppt, "SaveAs", Dispatch.Method, new Object[] { pdfFile, PPT_SAVEAS_PDF }, new int[1]); // Dispatch.invoke(ppt, "SaveAs", Dispatch.Method, new Object[] { new Variant(PPT_SAVEAS_PDF) }, new int[1]); Dispatch.callN(ppt, "SaveAs", new Variant(pdfFile)); Dispatch.call(ppt, "Close"); activeXComponent.invoke("Quit"); // ComThread.Release(); return true; } /** * ppt to img * * @param inputFile * @param imgFile * @return */ public static boolean pptToImg(String inputFile, String imgFile) { // 打開(kāi)word應(yīng)用程序 ActiveXComponent app = new ActiveXComponent("PowerPoint.Application"); // 設(shè)置word不可見(jiàn),office可能有限制 // app.setProperty("Visible", false); // 獲取word中國(guó)所打開(kāi)的文檔,返回Documents對(duì)象 Dispatch files = app.getProperty("Presentations").toDispatch(); // 調(diào)用Documents對(duì)象中Open方法打開(kāi)文檔,并返回打開(kāi)的文檔對(duì)象Document Dispatch file = Dispatch.call(files, "open", inputFile, true, true, false).toDispatch(); // 調(diào)用Document對(duì)象的SaveAs方法,將文檔保存為pdf格式 // Dispatch.call(doc, "ExportAsFixedFormat", outputFile, // PPT_TO_PDF); Dispatch.call(file, "SaveAs", imgFile, PPT_SAVEAS_JPG); // 關(guān)閉文檔 // Dispatch.call(file, "Close", false); Dispatch.call(file, "Close"); // 關(guān)閉word應(yīng)用程序 // app.invoke("Quit", 0); app.invoke("Quit"); return true; } /** * get file extension * * @param argFilePath * @return */ public static String getFileSufix(String argFilePath) { int splitIndex = argFilePath.lastIndexOf("."); return argFilePath.substring(splitIndex + 1); } /** * subString file path * * @param argFilePath * file path * @return filePaths */ public static String getFilePath(String argFilePath) { int pathIndex = argFilePath.lastIndexOf("/"); return argFilePath.substring(0, pathIndex); } /** * 如果PDF存在則刪除PDF * * @param pdfPath */ private static void deletePdf(String pdfPath) { File pdfFile = new File(pdfPath); if (pdfFile.exists()) { pdfFile.delete(); } } }
根據(jù)自己的調(diào)試,試驗(yàn)一下吧。
另外還有一段WPS轉(zhuǎn)PDF,也貼一下,供大家參考一下
public void wps2PDF(String inputFile,String pdfFile) { File sFile = new File(inputFile); File tFile = new File(pdfFile); ActiveXComponent wps = null; try { ComThread.InitSTA(); wps = new ActiveXComponent("wps.application"); ActiveXComponent doc = wps.invokeGetComponent("Documents").invokeGetComponent("Open", new Variant(sFile.getAbsolutePath())); doc.invoke("ExportPdf", new Variant(tFile.getAbsolutePath())); doc.invoke("Close"); doc.safeRelease(); } catch (Exception e) { System.out.println(e.getMessage()); } finally { if (wps != null) { wps.invoke("Terminate"); wps.safeRelease(); } ComThread.Release(); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java SiteMesh新手學(xué)習(xí)教程代碼案例
這篇文章主要介紹了Java SiteMesh新手學(xué)習(xí)教程代碼案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Java數(shù)據(jù)結(jié)構(gòu)之有效隊(duì)列定義與用法示例
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之有效隊(duì)列定義與用法,結(jié)合實(shí)例形式分析了java有效隊(duì)列的數(shù)據(jù)插入、刪除、判斷、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10使用Java實(shí)現(xiàn)在Excel中創(chuàng)建下拉列表
下拉列表(下拉框)可以確保用戶(hù)僅從預(yù)先給定的選項(xiàng)中進(jìn)行選擇,這樣不僅能減少數(shù)據(jù)輸入錯(cuò)誤,還能節(jié)省時(shí)間提高效率,下面我們就來(lái)看看如何在java中利用免費(fèi)庫(kù)實(shí)現(xiàn)創(chuàng)建下拉列表吧2024-03-03Java數(shù)據(jù)結(jié)構(gòu)之紅黑樹(shù)的實(shí)現(xiàn)方法和原理詳解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之紅黑樹(shù)的實(shí)現(xiàn)方法和原理,紅黑樹(shù)是一種特殊的二叉查找樹(shù),每個(gè)結(jié)點(diǎn)都要儲(chǔ)存位表示結(jié)點(diǎn)的顏色,或紅或黑,本文將通過(guò)示例為大家詳細(xì)講講紅黑樹(shù)的原理及實(shí)現(xiàn),感興趣的朋友可以了解一下2024-02-02說(shuō)說(shuō)@ModelAttribute在父類(lèi)和子類(lèi)中的執(zhí)行順序
這篇文章主要介紹了@ModelAttribute在父類(lèi)和子類(lèi)中的執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06使用SpringAop動(dòng)態(tài)獲取mapper執(zhí)行的SQL,并保存SQL到Log表中
這篇文章主要介紹了使用SpringAop動(dòng)態(tài)獲取mapper執(zhí)行的SQL,并保存SQL到Log表中問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03java顯示當(dāng)前運(yùn)行時(shí)的參數(shù)(java運(yùn)行參數(shù))
這篇文章主要介紹了java顯示當(dāng)前運(yùn)行時(shí)參數(shù)的示例(java運(yùn)行參數(shù)),需要的朋友可以參考下2014-04-04Java中Long類(lèi)型傳入前端數(shù)值出錯(cuò)問(wèn)題
這篇文章主要介紹了Java中Long類(lèi)型傳入前端數(shù)值出錯(cuò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04