原本是应该用pageOffice实现在线打开word的编辑,保存,转换成PDF,并完成签章,由于公司预算不够,pageOffice组件不能购买,所以只能另想他法。
需要编辑的word文档的模板是固定的,数量也不多,但对格式要求比较严格,所以决定将模板全部做成HTML页面,用iText组件将HTML转换成PDF。
需要导入的jar包:
首先需要将模板做成类似于下面这样的页面,横线上的数据是可以动态填充,编辑的,填充数据可以使用Freemarker
使页面可编辑可以使用Html的contenteditable=“true”
由于页面是可以动态编辑的,所以我们需要获得编辑后的页面的源码
var outerHTML = document.documentElement.outerHTML;
这里要注意,页面中的所有标签都是需要闭合的,如果不闭合的话iText组件在转换过程中会报错,页面中的字体需要是宋体,因为iText的转换需要有字体文件的支持,所以你同时需要在项目中或者服务器上准备一个字体文件
body {
margin: 20px;
font-family:SimSun;
}
下面是后台接收到页面源码后的处理
@RequestMapping("acceptPage")
@ResponseBody
public Map acceptPage(HttpServletRequest request) throws Exception {
Map map=new HashMap();
String text = request.getParameter("text");
//使用jsoup来对html源码进行解析,能够校验格式的完整性,并生成一个新的Document
org.jsoup.nodes.Document parse = Jsoup.parse(text);
Elements meta = parse.getElementsByTag("meta");
String html = parse.html();
for (Element link : meta) {//手动为一些标签添加闭合
String s = link.outerHtml();
String s1=s.replace("/>",">");
html=html.replace(s,s1+"</meta>");
}
Elements link1 = parse.getElementsByTag("link");
for (Element link : link1) {
String s = link.outerHtml();
String s1=s.replace("/>",">");
html=html.replace(s,s1+"</link>");
}
html=html.replaceAll(" ","");
try {
String outputFile="E:\\test.pdf";
OutputStream os = new FileOutputStream(outputFile);
//中文宋体文件路径
String fontPath=StringUtil.trimSufffix(fontUrl, File.separator)+File.separator+"simsun.ttc";
//String fontPath= "C:\\simsun.ttc";
ITextRenderer render = new ITextRenderer();
ITextFontResolver fontResolver = render.getFontResolver();
fontResolver.addFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
render.setDocumentFromString(html);
render.layout();
render.createPDF(os);
os.close();
} catch (Exception e) {
e.printStackTrace();
map.put("state",1);
map.put("msg","文件转换失败!请联系管理员!");
return map;
}
}
后面是对生成PDF文件进行签章的操作,就不再说了
这是最终生成的PDF,样式是没有问题的,也实现了可编辑,保存的功能。