您好,登錄后才能下訂單哦!
背景:日常開發ERP系統,會有一些工單或者合同之類需要填寫打印。我們就會將其word模板來通過系統自動化填寫并轉換為PDF格式(PDF文件打印可保證文件質量,是一種通用的格式。文件不易去修改,比較穩定)。所以我們將通過jacob來實現這些功能。
準備工作:
1.服務器需要安裝office2007,因為我們就是調用這個來實現轉換。
2.需要安裝插件jacob,安裝jacob-1.14.3-x86.dll到jdk\jdk1.7.0\jre\bin(你自己電腦安裝的jdk)
3.需要使用jacob-1.14.3.jar包
maven代碼如下:
<dependency> <groupId>net.sf.jacob-project</groupId> <artifactId>jacob</artifactId> <version>1.14.3</version> </dependency>
4.假如通過以上準備工作未成功轉換,就下載一個SaveAsPDFandXPS.exe組件(office2007里的)。我就是通過這個組件才完成轉換。
5.上面的在系統為windows7中就可以了,假如你的項目需要發布到服務器(服務器系統一般都是windows2008)。則還需要一步。在上面的基礎上再安裝安裝jacob-1.14.3-x64.dll到jdk\jdk1.7.0\jre\bin(你自己電腦安裝的jdk)中。很多人在win7下都能成功轉換,但在win2008就是出問題。我就是通過磨了一天的時間,看了各種日志才發現問題。
一、工具類(OperationIo.java),這里面可以不做任何修改,復制粘貼就可以了。
package com.repair.util.pub; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComThread; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class OperationIO { static final int wdFormatPDF = 17;// PDF 格式 /** * WORD轉換PDF * @param sfileName WORD文件存在位置 * @param toFileName PDF文件存放位置 */ public static void wordToPDF(String sfileName,String toFileName){ System.out.println("啟動Word..."); long start = System.currentTimeMillis(); ActiveXComponent app = null; Dispatch doc = null; try { //調用office word app = new ActiveXComponent("Word.Application"); app.setProperty("Visible", new Variant(false)); Dispatch docs = app.getProperty("Documents").toDispatch(); doc = Dispatch.call(docs, "Open" , sfileName).toDispatch(); System.out.println("打開文檔..." + sfileName); System.out.println("轉換文檔到PDF..." + toFileName); File tofile = new File(toFileName); if (tofile.exists()) { tofile.delete(); } Dispatch.call(doc, "SaveAs", toFileName, // FileName wdFormatPDF); long end = System.currentTimeMillis(); System.out.println("轉換完成..用時:" + (end - start) + "ms."); } catch (Exception e) { System.out.println("========Error:文檔轉換失敗:" + e.getMessage()); } finally { Dispatch.call(doc,"Close",false); System.out.println("關閉文檔"); if (app != null) app.invoke("Quit", new Variant[] {}); } //如果沒有這句話,winword.exe進程將不會關閉 ComThread.Release(); } /** * 遞歸刪除目錄下的所有文件及子目錄下所有文件 * @param dir 將要刪除的文件目錄 * @return boolean Returns "true" if all deletions were successful. * If a deletion fails, the method stops attempting to * delete and returns "false". */ public static boolean deleteDir(File dir) { if (dir.isDirectory()) { String[] children = dir.list(); for (int i=0; i<children.length; i++) { boolean success = deleteDir(new File(dir, children[i])); if (!success) { return false; } } } // 目錄此時為空,可以刪除 return dir.delete(); } /** * 將圖片文件轉化為字節數組字符串,并對其進行Base64編碼處理 * @param imgFilePath 圖片地址路徑 */ public static String GetImageStr(String imgFilePath) {// byte[] data = null; // 讀取圖片字節數組 try { InputStream in = new FileInputStream(imgFilePath); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } // 對字節數組Base64編碼 BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data);// 返回Base64編碼過的字節數組字符串 } /** * 將二進制轉換為圖片 * * @param base64String */ public static void base64StringToImage(String base64String,String imageoutpath) { try { BASE64Decoder decoder = new sun.misc.BASE64Decoder(); byte[] bytes1 = decoder.decodeBuffer(base64String); ByteArrayInputStream bais = new ByteArrayInputStream(bytes1); BufferedImage bi1 = ImageIO.read(bais); File w2 = new File(imageoutpath);// 可以是jpg,png,gif格式 ImageIO.write(bi1, "jpg", w2);// 不管輸出什么格式圖片,此處不需改動 } catch (IOException e) { e.printStackTrace(); } } }
二、業務類(PrintWordToPdf.java) ,這里
package com.hjm.Test; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.io.Writer; import java.util.HashMap; import java.util.Map; import com.engineering.pojos.pub.gcRecordArchive; import com.repair.util.pub.OperationIO; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; public class PrintWordToPdf { public static void main(String[] args) { //創建一個Configuration的實例 Configuration configuration = new Configuration(); //設置編碼 configuration.setDefaultEncoding("utf-8"); //創建Map對象,來保存要填寫的數據 Map<String, Object> paraMap = new HashMap<String, Object>(); //下面這些是我測試的一些數據 paraMap.put("ReceivingParty", "中國民航"); paraMap.put("PackingListNo", 10087); paraMap.put("ConNo", 10088); try { //調用模板的文件夾,new File("D:\\測試")是一個絕對路徑,你可以自己設置為服務器路徑。 configuration.setDirectoryForTemplateLoading(new File("D:\\測試")); } catch (IOException e) { e.printStackTrace(); } Template t = null; try { //獲取模板文件 t = configuration.getTemplate("FMO-08 Packing List.ftl"); // 獲取模板文件 } catch (IOException e) { e.printStackTrace(); } //生成一個文件保存的文件夾 File file =new File("D:\\最終"); //判斷文件夾是否存在,存在刪除并重創 if (!file .exists() && !file .isDirectory()) { file.mkdir(); } else { boolean b = OperationIO.deleteDir(file); if(b){ file.mkdir(); } } //填寫數據后生成的word文件。 String outfilepath = "D:/最終\\結果"+".doc"; File outFile = new File(outfilepath); // 導出文件 Writer out = null; try { try { out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(outFile),"utf-8")); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e1) { e1.printStackTrace(); } try { t.process(paraMap,out); // 將填充數據填入模板文件并輸出到目標文件 out.flush(); out.close(); //轉換PDF的文件 OperationIO.wordToPDF(outfilepath,"D:/最終\\結果"+".pdf"); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
總結:通過以上代碼,就可以在模板中填寫好數據,并將其生成word文件與其pdf文件。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。