Java freemarker生成word模板文件(如合同文件)及转pdf文件方法
Java freemarker生成word模板文件(如合同文件)及转pdf文件方法
创建模板文件
ContractTemplate.docx
ContractTemplate.xml
导入的Jar包
compile("junit:junit")
compile("org.springframework:spring-test")
compile("org.springframework.boot:spring-boot-test")
testCompile 'org.springframework.boot:spring-boot-starter-test'
compile 'org.freemarker:freemarker:2.3.28'
compile 'fakepath:aspose-words:19.5jdk'
compile 'fakepath:aspose-cells:8.5.2'
Java工具类 xml文档 转换 Word XmlToDocx.java
package com.test.docxml.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; /** * xml文档 转换 Word */ public class XmlToDocx { /** * * @param documentFile 动态生成数据的docunment.xml文件 * @param docxTemplate docx的模板 * @param toFilePath 需要导出的文件路径 * @throws Exception */ public static void outDocx(File documentFile, String docxTemplate, String toFilePath,String key) throws Exception { try { File docxFile = new File(docxTemplate); ZipFile zipFile = new ZipFile(docxFile); Enumeration<? extends ZipEntry> zipEntrys = zipFile.entries(); FileOutputStream fileOutputStream = new FileOutputStream(toFilePath); ZipOutputStream zipout = new ZipOutputStream(fileOutputStream); 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(); } } }
Java工具类 word文档 转换 PDF WordToPdf.java
package com.test.docxml.utils; import com.aspose.cells.*; import com.aspose.cells.License; import com.aspose.words.*; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; /** * word文档 转换 PDF */ public class WordToPdf { /** * 获取license许可凭证 * @return */ private static boolean getLicense() { boolean result = false; try { String licenseStr = "<License>\n" + " <Data>\n" + " <Products>\n" + " <Product>Aspose.Total for Java</Product>\n" + " <Product>Aspose.Words for Java</Product>\n" + " </Products>\n" + " <EditionType>Enterprise</EditionType>\n" + " <SubscriptionExpiry>20991231</SubscriptionExpiry>\n" + " <LicenseExpiry>20991231</LicenseExpiry>\n" + " <SerialNumber>23dcc79f-44ec-4a23-be3a-03c1632404e9</SerialNumber>\n" + " </Data>\n" + " <Signature>0nRuwNEddXwLfXB7pw66G71MS93gW8mNzJ7vuh3Sf4VAEOBfpxtHLCotymv1PoeukxYe31K441Ivq0Pkvx1yZZG4O1KCv3Omdbs7uqzUB4xXHlOub4VsTODzDJ5MWHqlRCB1HHcGjlyT2sVGiovLt0Grvqw5+QXBuinoBY0suX0=</Signature>\n" + "</License>"; InputStream license = new ByteArrayInputStream(licenseStr.getBytes("UTF-8")); License asposeLic = new License(); asposeLic.setLicense(license); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * word文档 转换为 PDF * @param inPath 源文件 * @param outPath 目标文件 */ public static File doc2pdf(String inPath, String outPath) { //验证License,获取许可凭证 if (!getLicense()) { return null; } //新建一个PDF文档 File file = new File(outPath); try { //新建一个IO输出流 FileOutputStream os = new FileOutputStream(file); //获取将要被转化的word文档 Document doc = new Document(inPath); // 全面支持DOC, DOCX,OOXML, RTF HTML,OpenDocument,PDF, EPUB, XPS,SWF 相互转换 doc.save(os, com.aspose.words.SaveFormat.PDF); os.close(); } catch (Exception e) { e.printStackTrace(); } return file; } public static void main(String[] args) { doc2pdf("D:/1.doc", "D:/1.pdf"); } }
Java单元测试类 XmlDocTest.java
package com.test.docxml; import com.test.docxml.utils.WordToPdf; import com.test.docxml.utils.XmlToDocx; import freemarker.template.Configuration; import freemarker.template.Template; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import java.io.File; import java.io.PrintWriter; import java.io.Writer; import java.nio.charset.Charset; import java.util.HashMap; import java.util.Locale; import java.util.Map; /** * 本地单元测试 */ @RunWith(SpringJUnit4ClassRunner.class) //@RunWith(SpringRunner.class) @SpringBootTest(classes= TemplateApplication.class) @WebAppConfiguration public class XmlDocTest { //短租 @Test public void testContract() throws Exception{ String contractNo = "1255445544"; String contractCorp = "银河宇宙无敌测试soft"; String contractDate = "2022-01-27"; String contractItem = "房地产交易中心"; String contractContent = "稳定发展中的文案1万字"; //doc xml模板文件 String docXml = "ContractTemplate.xml"; //使用替换内容 //xml中间临时文件 String xmlTemp = "tmp-ContractTemplate.xml"; //生成文件的doc文件 String toFilePath = contractNo + ".docx"; //模板文档 String docx = "ContractTemplate.docx"; //生成pdf文件 String toPdfFilePath = contractNo + ".pdf";; String CONTRACT_ROOT_URL = "/template"; Resource contractNormalPath = new ClassPathResource(CONTRACT_ROOT_URL + File.separator + docXml); String docTemplate = contractNormalPath.getURI().getPath().replace(docXml, docx); //设置文件编码(注意点1) Writer writer = new PrintWriter(new File(xmlTemp),"UTF-8"); Configuration configuration = new Configuration(Configuration.VERSION_2_3_28); configuration.setEncoding(Locale.CHINESE, Charset.forName("UTF-8").name()); //设置配置(注意点3) configuration.setDefaultEncoding("UTF-8"); String filenametest = contractNormalPath.getURI().getPath().replace(docXml, ""); System.out.println("filenametest=" + filenametest); configuration.setDirectoryForTemplateLoading(new File(filenametest)); // Template template = configuration.getTemplate(ContractConstants.CONTRACT_NORMAL_URL+orderType+type+".xml"); //设置模板编码(注意点2) Template template = configuration.getTemplate(docXml,"UTF-8"); //绝对地址 Map paramsMap = new HashMap(); paramsMap.put("contractCorp",contractCorp); paramsMap.put("contractDate",contractDate); paramsMap.put("contractNo",contractNo); paramsMap.put("contractItem",contractItem); paramsMap.put("contractContent",contractContent); template.process(paramsMap, writer); XmlToDocx.outDocx(new File(xmlTemp), docTemplate, toFilePath, null); System.out.println("do finish"); //转成pdf WordToPdf.doc2pdf(toFilePath,toPdfFilePath); } }
创建成功之后的文件如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律