功能需求描述:word文件中有动态数据,需要将动态数据的word文件在jsp或HTML页面预览,最后进行打印、
总体实现过程 制作模板----动态生成word模板文件----word文件转为pdf-----页面使用iframe嵌套预览pdf
详细实现:1、制作模板文件。打开word文件,先以${test}形式替换文件中每一个需要动态加载的数据:如图(如果word文件是.docx的打开后先另存为word2003版本的.doc格式,方便后续操作),根据自己的需求设定好模板格式,最后打印预览打印都是以此格式展示的。
2、替换完成后,将文件另存为xml文件,再将.xml直接修改文件后缀为.ftl格式的标准模板文件,至此模板文件制做完成
3、framemaker加载模板这一步很重要
package com.xwr.app.utils.print;
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.Writer;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class DocumentHandler {
private Configuration configuration = null;
public DocumentHandler() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
}
public void createDoc(HttpServletRequest request,Map<String,Object> dataMap,String fileName) throws Exception {
//dataMap 要填入模本的数据文件
//设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
//这里我的ftl模板是放在WebRoot中的template文件夹中
configuration.setServletContextForTemplateLoading(request.getSession().getServletContext(), "/template");
System.out.println(this.getClass());
//configuration.setServletContextForTemplateLoading(ServletActionContext.getServletContext(),"\template");
Template t=null;
try {
//lzyjhf.ftl为要装载的模板
t = configuration.getTemplate("lzyjhf.ftl");
} catch (IOException e) {
e.printStackTrace();
}
//输出文档路径及名称
File outFile = new File(fileName);
Writer out = null;
FileOutputStream fos=null;
try {
fos = new FileOutputStream(outFile);
OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");
//这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。
//out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
out = new BufferedWriter(oWriter);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out);
out.close();
fos.close();
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//System.out.println("---------------------------");
}
}
4、word转为pdf
package com.xwr.app.utils.print;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import com.aspose.words.Document;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
public class Doc2Pdf {
public static boolean getLicense() {
boolean result = false;
try {
InputStream is = Main.class.getClassLoader().getResourceAsStream("/license.xml"); // license.xml我放在src下
License aposeLic = new License();
aposeLic.setLicense(is);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static void doc2pdf(String Address) {
if (!getLicense()) { // 验证License 若不验证则转化出的pdf文档会有水印产生
return;
}
try {
long old = System.currentTimeMillis();
File file = new File("E:/pdf1.pdf"); //新建一个空白pdf文档
FileOutputStream os = new FileOutputStream(file);
Document doc = new Document(Address); //Address是将要被转化的word文档
doc.save(os, SaveFormat.PDF);//全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换
long now = System.currentTimeMillis();
System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒"); //转化用时
} catch (Exception e) {
e.printStackTrace();
}
}
}
5、以上代码测试类
package com.xwr.app.utils.print;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
public class Main {
/**
* @param args
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws UnsupportedEncodingException {
HttpServletRequest request = null;
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("deptswj", "AAAAA");
dataMap.put("year", "BBBBB");
dataMap.put("num", "17");
dataMap.put("deptname", "人事处");
dataMap.put("username", "CCCCC");
dataMap.put("kssj", "2020年10月11日");
dataMap.put("jssj", "2020年12月13日");
dataMap.put("username", "小明");
dataMap.put("lzyjnr", "测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试");
dataMap.put("deptswj", "DDDD");
dataMap.put("zfsj", "2020年12月13日");
DocumentHandler mdoc = new DocumentHandler ();
try {
mdoc.createDoc(request,dataMap, "E:/20201219.doc");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//加载word示例文档
Document document = new Document();
document.loadFromFile("E:/20201219.doc");
//保存结果文件
document.saveToFile("E:/20201219111.pdf", FileFormat.PDF);
}
}
6、相关jar包和license文件请在我的资源中下载