Java word动态数据填充并转为pdf最详细的讲解附带项目
Java Word數據動態填充,并將word轉為pdf
適用范圍:
1.已有word模板,word中的一些數據需要動態生成。
2.word轉為pdf
本文章講解的內容是一個完整的適用流程。就是首先是一個word模板,然后動態填充數據生成了一個新的word,填充數據之后最后轉換成了pdf。
如果你只需要動態填充數據,得到一個新的word的話,適當修改下代碼就可以了。說白了就是刪代碼,因為本身就用到了此功能。
如果你需要word轉為pdf,適當修改下代碼也是可以的。說白了還是刪代碼,因為本身也用到此功能。
發揮您的想象空間,此插件甚是強大。有問題聯系我哦。代碼注釋里說了怎么找我…
話不多說,上干貨,上代碼…
Constants.java
package org.example.util;/*** @author lucas* @program wtp-site* @description* @createDate 2020-03-04 23:05:31* 關注微信公眾號"走進Java",600GJava架構師網盤資料等你下載* 這套代碼我已經親測可用了。若有特殊問題,請于公眾號里隨時與我聯系。**/ public class Constants {/*** aspose需要的簽名文件名稱*/public static String licensePath = "license.xml";/*** 模板,簽名文件存放的路徑(絕對路徑哈,我這里是mac的絕對路徑。)*/public static String docXmlTemplatePath = "/Users/lisw/work/work-project/workTppdf/"; }DocToPdf.java
package org.example.util;import com.aspose.words.Document; import com.aspose.words.FontSettings; import com.aspose.words.License; import com.aspose.words.SaveFormat;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.Map; import java.util.UUID; /*** @author lucas* @program wtp-site* @description word轉pdf核心代碼* @createDate 2020-03-04 23:05:31* 關注微信公眾號"走進Java",600GJava架構師網盤資料等你下載* 這套代碼我已經親測可用了。若有特殊問題,請于公眾號里隨時與我聯系。**/ public class DocToPdf {static String docTemplatePath = Constants.docXmlTemplatePath;public static boolean getLicense() {boolean result = false;try {InputStream is = new FileInputStream(docTemplatePath+Constants.licensePath);License aposeLic = new License();aposeLic.setLicense(is);result = true;} catch (Exception e) {e.printStackTrace();}return result;}public static String DocToPdf(Map<String,Object> params,String documentXmlName,String documentDocName) throws Exception {try{if (!getLicense()) { // 驗證License 若不驗證則轉化出的pdf文檔會有水印產生return null;}String templateUUId = UUID.randomUUID().toString();String baseUrl=System.getProperty("java.io.tmpdir")+"/";String xml = baseUrl+templateUUId+".xml";XmlToDocx.toDocx(documentXmlName,docTemplatePath+documentDocName,xml,baseUrl+templateUUId+".docx",params);String docx = baseUrl+templateUUId+".docx";String pdf = baseUrl+templateUUId+".pdf";File file = new File(pdf); // 新建一個空白pdf文檔FileOutputStream os = new FileOutputStream(file);Document doc = new Document(docx); // Address是將要被轉化的word文檔String osName = isWindows();String fonts [] = null;/*** 適配字體文件*/if(osName.equals("linux")){fonts = new String[]{"/usr/share/fonts/chinese/","/usr/share/fonts/simsun/","/usr/share/fonts/black/","/usr/share/fonts/wingdings/"};}else if(osName.equals("mac")){fonts = new String[]{"/Users/fonts/chinese/","/Users/fonts/simsun/","/Users/fonts/black/","/Users/fonts/wingdings/"};}FontSettings.setFontsFolders(fonts, true);doc.save(os, SaveFormat.PDF);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,if(os!=null){os.close();}delete(xml,docx);//刪除文件return pdf;}catch (Exception e){e.printStackTrace();return null;}}private static String isWindows() {String osName = System.getProperties().getProperty("os.name").toUpperCase();if(osName.indexOf("WINDOWS")!=-1){return "windows";}else if(osName.indexOf("MAC")!=-1){return "mac";}else{return "linux";}}public static void delete(String xmlPath,String wordPath){File file = new File(xmlPath);if(file.exists()){file.delete();}File wordFile = new File(wordPath);if(wordFile.exists()){wordFile.delete();}}}XmlToDocx.java
package org.example.util;import freemarker.template.TemplateException;import java.io.*; import java.util.Enumeration; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream;/*** @author lucas* @program wtp-site* @description word動態填充數據核心類* @createDate 2020-03-04 23:05:31* 關注微信公眾號"走進Java",600GJava架構師網盤資料等你下載* 這套代碼我已經親測可用了。若有特殊問題,請于公眾號里隨時與我聯系。**/ public class XmlToDocx {/*** @param xmlTemplate xml的文件名* @param docxTemplate docx的路徑和文件名* @param xmlTemp 填充完數據的臨時xml* @param toFilePath 目標文件名* @param map 需要動態傳入的數據* @throws IOException*/public static void toDocx(String xmlTemplate, String docxTemplate, String xmlTemp, String toFilePath, Map map) {try {// 1.map是動態傳入的數據// 這個地方不能使用FileWriter因為需要指定編碼類型否則生成的Word文檔會因為有無法識別的編碼而無法打開Writer w1 = new OutputStreamWriter(new FileOutputStream(xmlTemp), "utf-8");// 2.把map中的數據動態由freemarker傳給xmlXmlTplUtil.process(xmlTemplate, map, w1);// 3.把填充完成的xml寫入到docx中XmlToDocx xtd = new XmlToDocx();xtd.outDocx(new File(xmlTemp), docxTemplate, toFilePath);} catch (Exception e) {e.printStackTrace();}}/*** @param documentFile 動態生成數據的docunment.xml文件* @param docxTemplate docx的模板* @param toFilePath 需要導出的文件路徑* @throws ZipException* @throws IOException*/public void outDocx(File documentFile, String docxTemplate, String toFilePath) throws ZipException, IOException {try {File docxFile = new File(docxTemplate);ZipFile zipFile = new ZipFile(docxFile);Enumeration<? extends ZipEntry> zipEntrys = zipFile.entries();ZipOutputStream zipout = new ZipOutputStream(new FileOutputStream(toFilePath));int len = -1;byte[] buffer = new byte[1024];while (zipEntrys.hasMoreElements()) {ZipEntry next = zipEntrys.nextElement();InputStream is = zipFile.getInputStream(next);// 把輸入流的文件傳到輸出流中 如果是word/document.xml由我們輸入zipout.putNextEntry(new ZipEntry(next.toString()));if ("word/document.xml".equals(next.toString())) {InputStream in = new FileInputStream(documentFile);while ((len = in.read(buffer)) != -1) {zipout.write(buffer, 0, len);}in.close();} else {while ((len = is.read(buffer)) != -1) {zipout.write(buffer, 0, len);}is.close();}}zipout.close();} catch (Exception e) {e.printStackTrace();}}}XmlTplUtil.java
package org.example.util; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import java.io.File; import java.io.IOException; import java.io.Writer; import java.util.Map;/*** @author lucas* @program wtp-site* @description word動態填充工具類* @createDate 2020-03-04 23:05:31* 關注微信公眾號"走進Java",600GJava架構師網盤資料等你下載* 這套代碼我已經親測可用了。若有特殊問題,請于公眾號里隨時與我聯系。**/ public class XmlTplUtil {private static XmlTplUtil tplm = null;private Configuration cfg = null;private XmlTplUtil() {cfg = new Configuration();try {cfg.setDirectoryForTemplateLoading(new File(Constants.docXmlTemplatePath));} catch (Exception e) {e.printStackTrace();}}private static Template getTemplate(String name) throws IOException {if (tplm == null) {tplm = new XmlTplUtil();}Template template = tplm.cfg.getTemplate(name,"utf-8");return template;}/*** @param templatefile 模板文件* @param param 需要填充的內容* @param out 填充完成輸出的文件* @throws IOException* @throws TemplateException*/public static void process(String templatefile, Map param, Writer out) throws IOException, TemplateException {// 獲取模板Template template = XmlTplUtil.getTemplate(templatefile);template.setOutputEncoding("utf-8");// 合并數據template.process(param, out);if (out != null) {out.close();}}}App.java Main方法主類執行入口
package org.example;import org.example.util.DocToPdf;import java.util.HashMap; import java.util.Map;/*** @author lucas* @program wtp-site* @description* @createDate 2020-03-04 23:05:31* 關注微信公眾號"走進Java",600GJava架構師網盤資料等你下載* 這套代碼我已經親測可用了。若有特殊問題,請于公眾號里隨時與我聯系。**/ public class App {/*** 注意事項* 1:如果轉換之后有亂碼現象,極大的概率是你的word當中用了系統不支持的字體。* 比如微軟雅黑,你在本地windows上可能可以用,一旦你放到了服務器上面,Linux沒有這個字體就會亂碼。需要安裝字體。* @param args* @throws Exception*/public static void main( String[] args ) throws Exception {Map<String,Object> params = new HashMap<String,Object>();params.put("name","Lucas");String pdfPath = DocToPdf.DocToPdf(params, "document.xml", "template.docx");//pdfPath便是最后在系統磁盤里生成的絕對路徑地址了,后續業務如果需要,可以讀取這個路徑進行把文件上傳到云空間里或者其他地方。//如果上傳到云空間了,記得把這個文件在系統磁盤刪掉,避免占用系統磁盤。//有問題,公眾號找我。我等你System.out.println("pdf已生成,路徑是:"+pdfPath);} }截止到此,代碼已經貼完了。不想看,就下附件,小意思…
注意事項:
1:使用前需要準備三個文件,第一個word模板文件(word格式,代碼中文件名叫做template.docx),第二個簽名文件(xml格式。我會給你,直接用就行了,代碼中叫做license.xml),第三個word模板的源代碼文件(xml格式,代碼中文件名叫做document.xml)
2:word模版文件:找到你需要生成的word源文件,名字改為template.docx(不改文件名,你就改代碼,改成你的文件名字)
3:word源代碼文件:這個就需要點東西才能生成了,首先把你的word源文件復制一份哈,畢竟代碼還是要用到的。然后將復制后的文件,后綴名改為zip,然后解壓zip,找到word文件夾里面的document.xml,這個就是word的源代碼文件啦。
4:Constants.java里面需要配置一下,你這些源文件所在的文件夾路徑(切記切記切記)。
我的template.docx是這樣的
我的document.xml是這樣的
生成生后的pdf是這樣的
動態數據填充完成,并且成功轉換成了pdf。結束了。有問題代碼中找我哦…
以下是項目工程哈,有一個aspose的jar包在maven里面是沒有的,我也附帶給你們了哈。
完整實例代碼請關注微信公眾號:走進Java。回復“word”就可以領取了哦。
總結
以上是生活随笔為你收集整理的Java word动态数据填充并转为pdf最详细的讲解附带项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SkyEye硬件模拟平台:硬件仿真实现之
- 下一篇: 浙江大学 计算机学院 刘辉,【夏文莉】_