最近項目中碰到需求,需要將上傳的word文檔轉換為pdf文件,雖然說要實現這個可以使用poi,openOffice,laberOffice,這些都能實現,但是都有一個共同的詬病就是轉出的文件都會失真,但是需求是不能失真,所以這個的話比較難實現,最后,經過反復的查找,終於發現了jacob這個技術,可以說,他實現的word轉pdf功能是能夠不失真實現的,但是在使用的過程中,由於服務器和jdk等各種環境因素的緣故,碰到了很多問題,於是乎在這里做一個筆記,也同時能夠分享一下,希望對各位有幫助。
首先是在官網下載對應版本的jacob包,注意,M*版本的最好是不要用,這個是各個版本的更新中間包,最好是現在不帶M*版本的文件。
下載好文件后,需要你部署系統的本地轉好word(wps也可以,這個需要自己測試)。
然后部署很簡單,不需要裝插件以及各種花式配置環境,只需要將jacob-1.18-x64.dll拷貝至jdk的bin目錄下(這個是64位系統的dll文件,其選擇依據是根據你部署系統的位數去確定的,當然有些把這個文件是放在jdk-》jre-》bin下,這個需要自己試,看你引用的是jdk還是jre),其實很多地方說要部署至這個部署那個,經過本人測試,只需要這一步即可,環境放多了容易出現奇奇怪怪的問題。
然后將jacob.jar包放入你的項目中即可,這樣的話,已經配置好了jacob環境。
編寫一個測試類word2Pdf.java,如下:
package com.advance.util; import java.io.File; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComThread; import com.jacob.com.Dispatch; public class Word2PdfUtil { static final int wdFormatPDF = 17;// word轉PDF 格式 public static void word2pdf(String source, String target) { ComThread.InitSTA(); ActiveXComponent app = null; try { app = new ActiveXComponent("Word.Application"); app.setProperty("Visible", false); Dispatch docs = app.getProperty("Documents").toDispatch(); Dispatch doc = Dispatch.call(docs, "Open", source, false, true).toDispatch(); File tofile = new File(target); if (tofile.exists()) { tofile.delete(); } Dispatch.call(doc, "SaveAs", target, wdFormatPDF); Dispatch.call(doc, "Close", false); } catch (Exception e) { System.out.println(e.toString()); } finally { if (app != null) { app.invoke("Quit", 0); } ComThread.Release(); } } }
這個是可以使用main方法測試的,是沒問題的,當然,在這個過程中會碰到很多問題,有時間我也會做一做筆記的。web測試轉pdf以及pdf加水印的話我下次更新中會提到。