Java程式實現Word文件轉為pdf以及出現的問題解決
阿新 • • 發佈:2019-01-10
做獸醫專案需要用到這種需求,很多程式設計師都遇到過,有些word文件希望直接在瀏覽器中開啟進行預覽,但是瀏覽器往往不是很配合,直接就提示下載,不像pdf文件,瀏覽器可以直接進行預覽。
1. Word文件轉為pdf直接上程式碼:
import java.io.File; import org.apache.poi.POIXMLDocument; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComThread; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class Word2pdf { static final int wdFormatPDF = 17;// PDF 格式 public int wordToPDF(String sfileName,String toFileName) throws Exception{ System.out.println("啟動Word..."); long start = System.currentTimeMillis(); ActiveXComponent app = null; Dispatch doc = null; try { app = new ActiveXComponent("Word.Application"); // 設定word不可見 app.setProperty("Visible", new Variant(false)); // 開啟word檔案 Dispatch docs = app.getProperty("Documents").toDispatch(); // doc = Dispatch.call(docs, "Open" , sourceFile).toDispatch(); doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] { sfileName, new Variant(false),new Variant(true) }, new int[1]).toDispatch(); System.out.println("開啟文件..." + sfileName); System.out.println("轉換文件到PDF..." + toFileName); File tofile = new File(toFileName); // System.err.println(getDocPageSize(new File(sfileName))); if (tofile.exists()) { tofile.delete(); } // Dispatch.call(doc, "SaveAs", destFile, 17); // 作為html格式儲存到臨時檔案::引數 new Variant(8)其中8表示word轉html;7表示word轉txt;44表示Excel轉html;17表示word轉成pdf。。 Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] { toFileName, new Variant(17) }, new int[1]); long end = System.currentTimeMillis(); System.out.println("轉換完成..用時:" + (end - start) + "ms."); } catch (Exception e) { e.printStackTrace(); System.out.println("========Error:文件轉換失敗:" + e.getMessage()); }catch(Throwable t){ t.printStackTrace(); } finally { // 關閉word Dispatch.call(doc,"Close",false); System.out.println("關閉文件"); if (app != null) app.invoke("Quit", new Variant[] {}); } //如果沒有這句話,winword.exe程序將不會關閉 ComThread.Release(); return 1; } private static Document read(File xmlFile) throws DocumentException { SAXReader saxReader = new SAXReader(); return saxReader.read(xmlFile); } // public String getDocPageSize(File file){ // String pages = null; // try{ // Document doc = read(file); // List<Node> nodes = doc.selectNodes("//o:Pages"); // if(nodes != null && nodes.size() > 0){ // pages = nodes.get(0).getText(); // System.out.println("/////////////////"); // System.out.println("該word文件的頁數為:"+Integer.parseInt(pages)); // System.out.println("/////////////////"); // }else{ // System.out.println("*********"); // System.out.println("頁面轉換錯誤"); // System.out.println("*********"); // } // }catch(Exception ex){ // ex.printStackTrace(); // } // return pages; // } public int getDocPageSize(String filePath) throws Exception { XWPFDocument docx = new XWPFDocument(POIXMLDocument.openPackage(filePath)); int pages = docx.getProperties().getExtendedProperties().getUnderlyingProperties().getPages();//總頁數 int wordCount = docx.getProperties().getExtendedProperties().getUnderlyingProperties().getCharacters();// 忽略空格的總字元數 另外還有getCharactersWithSpaces()方法獲取帶空格的總字數。 System.out.println ("pages=" + pages + " wordCount=" + wordCount); return pages; } public static void main(String[] args) throws Exception { Word2pdf d = new Word2pdf(); System.err.println(d.getDocPageSize("d:\\exportWord.docx")); d.wordToPDF("d:\\exportWord.docx", "d:\\law.pdf"); } }
可是能夠完全執行的應該不可能,還要準備工作,
出錯總結:
1.沒引入jar包,,這個錯誤我就不說了,,基本上所有人都可以避免.jacob.jar
2.
出現這個錯誤是因為缺少了jacob-1.17-x64.dll這個東西,,把jacob.dll(不同版本的jacob的dll檔名有所不同)複製到C:\Program Files\Java\jdk1.6.0_17\jre\bin(專案中用到的jre)目錄下即可。
注意:名字一定要改成和報錯的時候一樣的名字,差一點也不行。
3.由於出錯沒有截圖,所以現在錯誤也不好去演示了,,簡單的就是下面的錯誤
com.jacob.com.ComFailException: Invoke of: SaveAs
Source: Microsoft Word
Description: 命令失敗
出現這種錯誤網上也有很多解決辦法:如下
Office版本使用2007,因為2007提供了一個載入項:Microsoft Save as PDF 或 XPS,可將文件另存為PDF格式。下載地址:http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=4D951911-3E7E-4AE6-B059-A2E79ED87041,安裝即可使用。
4.最後一步,
d.wordToPDF("d:\\exportWord.docx", "d:\\law.pdf");
這個目錄一定要寫正確,如果你寫成d:\\pdf\\law.pdf,而d盤中又沒有pdf資料夾,則會報如下錯誤
<img src="https://img-blog.csdn.net/20161027104907109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
避免上面4種錯誤,則能夠萬無一失了,,還有jar和dll檔案版本要對應。。由於我沒出現這個錯誤,不過網上有人出過,,注意下就可以了。