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); } }

创建成功之后的文件如下:

Java freemarker生成word模板文件(如合同文件)及转pdf文件方法的更多相关文章

  1. Java Freemarker生成word

    Java Freemarker生成word freeMaker 简介: FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代 ...

  2. Java Web项目中使用Freemarker生成Word文档遇到的问题

    这段时间项目中使用了freemarker生成word文档.在项目中遇到了几个问题,在这里记录一下.首先就是关于遍历遇到的坑.整行整行的遍历是很简单的,只需要在整行的<w:tr></w ...

  3. 使用freemarker生成word、html时图片显示问题

    使用freemarker生成word.html时图片显示问题 博客分类: Java 使用freemarker生成word时图片显示问题使用freemarker生成html时图片显示问题使用iText生 ...

  4. FreeMarker生成word

    FreeMarker生成word数据填充是通过,Map填充. Map dataMap = new HashMap<String, Object>(); List<User> l ...

  5. 使用freemarker生成xml模板

    今天在java交流群里有个人问我如何用freemarker生成xml模板文件,可以手动配置参数,于是我到网上百度了一下.发现有一位同行的博文写的很nice,于是我就照着他的代码敲了一遍,最后实现了,本 ...

  6. freemarker生成word,表格分页

    在做项目的过程中,使用到了freemarker生成word.又有一个需求,明细的要确定有多少页,这就用到了换页的xml标签了,找了我好久 <w:p ><w:r><w:br ...

  7. JSP生成WORD文档,EXCEL文档及PDF文档的方法

    转自:https://www.jb51.net/article/73528.htm 本文实例讲述了JSP生成WORD文档,EXCEL文档及PDF文档的方法.分享给大家供大家参考,具体如下: 在web- ...

  8. C# 将多个office文件转换及合并为一个PDF文件

    PDF文件介绍 PDF(Portable Document Format )文件源于20世纪90年代初期,如今早已成为了一种最流行的的文件格式之一.因为PDF文件有很多优点: 支持跨平台和跨设备共享 ...

  9. Java Web项目中使用Freemarker生成Word文档

    Web项目中生成Word文档的操作屡见不鲜.基于Java的解决方式也是非常多的,包含使用Jacob.Apache POI.Java2Word.iText等各种方式,事实上在从Office 2003開始 ...

  10. java使用freemarker 生成word文档

      java 生成word文档     最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的 ...

随机推荐

  1. 【深度】阿里巴巴万级规模 K8s 集群全局高可用体系之美

    简介: 台湾作家林清玄在接受记者采访的时候,如此评价自己 30 多年写作生涯:"第一个十年我才华横溢,'贼光闪现',令周边黯然失色:第二个十年,我终于'宝光现形',不再去抢风头,反而与身边的 ...

  2. Flink + Iceberg + 对象存储,构建数据湖方案

    ​简介: 上海站 Flink Meetup 分享内容,如何基于Flink.对象存储.Iceberg 来构建数据湖生态. 本文整理自 Dell 科技集团高级软件研发经理孙伟在 4 月 17 日 上海站 ...

  3. [FAQ] Edge/Chrome 网络请求的编辑并重发

    1. 在网络请求上面右键,复制为fetch. 2. 切换到Console控制台,粘贴并回车. fetch 是javascript中一个网络请求的函数或者工具,Chrome在我们 Copy as fet ...

  4. dotnet 提升 ToUpper 性能

    在应用软件启动过程中,客户端应用软件是对性能敏感的.比如在解析命令行参数的时候,有时候需要进行字符串处理逻辑.一般来说命令行参数都是语言文化无关的,在需要进行全大写或全小写转换过程中,采用 ToUpp ...

  5. 阿里面试Redis最常问的三个问题:缓存雪崩、击穿、穿透(带答案)

    那提到Redis我相信各位在面试,或者实际开发过程中对缓存雪崩,穿透,击穿也不陌生吧,就算没遇到过但是你肯定听过,那三者到底有什么区别,我们又应该怎么去防止这样的情况发生呢,我们有请下一位受害者. 面 ...

  6. AI编译器CINN v.s TVM 中CodeGen 源码解读

    如下的技术点梳理仅以「日常优化工作」为牵引点,涉及哪个模块,就具体去看哪个模块的代码. 一.CINN 框架 CINN 中CodeGen之后的代码编译主要交给了Compiler类来负责.核心的函数主要是 ...

  7. cesium基础知识汇总PPT版

    以上教程来自火星科技,原视频教程地址如下: https://ke.qq.com/course/468292/3985600802137412#term_id=100560563

  8. 从零开始写 Docker(十四)---重构:实现容器间 rootfs 隔离

    本文为从零开始写 Docker 系列第十四篇,实现容器间的 rootfs 隔离,使得多个容器间互不影响. 完整代码见:https://github.com/lixd/mydocker 欢迎 Star ...

  9. Splashtop 教育行业用户增加700%

    ​ 由于新冠肺炎大流行继续限制对大学.学院和K-12学校的计算机实验室的物理访问,Splashtop的销售数据表明,越来越多的学校开始使用远程访问软件作为使用计算机实验室资源的替代方法. 在6月到8月 ...

  10. 一文了解npm install -g和npm install --save-dev的关系

    本文分享自华为云社区<npm install -g 和 npm install --save-dev 的关系>,作者: SHQ5785. 一.npm install 本地安装 将安装包放在 ...