JAVA根据word模板⽣成合同,并能实现⽹页在线浏览打印下
最近,
项⽬有这样⼀个需求:
根据我选择的模板(docx⽂件),和我表单填的数据,⽣成相应的合同⽂件(docx),该合同要能⽹页在线浏览/打印/下载在合同中还要放置签字图⽚和⾝份证图⽚
我的实现:
1上传⼀份合同模板,在⽤户提交表单数据的时候,把数据写进合同模板,⽣成完整合同单独保存。这⾥需要⽤到docx模板插件能插⼊图⽚的那种(⾝份证读卡器和签字⽣成的图⽚要放进合同⾥)
2再把这份⽂件后缀是docx的合同⽂件转换成PDF,再存⼀份(因为要浏览,刚好多数浏览器⽀持⽹页浏览PDF⽂件和打印下载,不⽤我⾃⼰去实现,想着再转存⼀份pdf⽂件,就能实现需求了)。这⾥需要⽤到转PDF插件
3等于每个⽣成的合同都有两份,⼀份docx源⽂件,⼀份PDF格式副本。
4当我页⾯需要⽹页在线浏览/打印/下载的时候,就把PDF的副本放上去⽤另外⼀个PDF浏览打印插件去实现。这⾥需要⽤到PDF浏览打印的js(展⽰在⽹页上的是合同的PDF⽂件,可以浏览/打印/下载)
总共三个插件,本着开源(免费)的态度去,最终淘汰了⼀些,我选择了以下三款插件
分别是:
1,:docx模板引擎,作⽤是根据输⼊的符号把他替换成相应的值
模板:
⽣成后:
坑点:相关依赖jar多,少个包报错排查半天没查出来,还有就是它依赖poi的版本既不能太⾼,也不能低,不然报错。我⽤的是3.17
2,:PDF浏览打印的js,只要导⼊这个js,把pdf⽂件所在的统⼀资源定位地址输进去就是,记住!不是绝对路径,是映射过的虚拟路径
3,:基于office⽂件转换PDF⽂件的插件。
这个有点坑,容我细说:
模板⽣成⼯具类涉及的插件我查了后就定了两个(免费的)。分别是liberOffice和OpenOffice,他们各有优劣
liberOffice⽣成的pdf精准度⾼,配置相对简单,不需要敲指令,但是⽣成速度很慢,⼀个⽂件需要等待数秒以上,影响⽤户体验,有时会崩溃,感觉没OpenOffice稳定。
OpenOffice⽣成的pdf精准度低,可能失真和样式混乱。配置⿇烦,每次重启服务器都要敲指令,但是⽣成速度很快很快,很少⽤时超过⼀秒的。
这是⼆者差别,因为插件都是⽤来⽣成合同⽤的,所以要⾼精准度,我选择了liberOffice,牺牲了速度(性能)。
下⾯附上我的⼯具类
根据LiberOffice⽣成pdf⼯具类,⼊参为⽂件全路径,执⾏完⽣成⼀份地址和名字⼀模⼀样的PDF⽂件,还需要配⼀下LiberOffice安装路径
package com.hk.Labor.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apachemons.io.FileUtils;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration; import org.artofsolving.jodconverter.office.OfficeManager;
import java.io.*;
SimpleDateFormat;
import java.util.Date;
import Pattern;
/**
* ⽂件格式转换PDF 可转换的⽂件类型:各种office⽂件,图⽚以及普通txt
*/
public class DocConverter {
protected static final Logger LOG = Logger(DocConverter.class); private String fileString;
private String outputPath = "";// 输⼊路径,如果不设置就输出在默认的位�?
private String fileName;
private File pdfFile;
private File docFile;
public DocConverter(String fileString) {
ini(fileString);
System.out.println("⽂件路径"+fileString);
}
public DocConverter() {
// TODO ⾃动⽣成的构造函数存根
}
/**
* * 重新设置file
*
* @param fileString
*            32.
*/
public void setFile(String fileString) {
ini(fileString);unicode在线工具
}
/**
*  * 初始
*
* @param fileString
*
*/
private void ini(String fileString) {
this.fileString = fileString;
fileName = fileString.substring(0, fileString.lastIndexOf("."));
docFile = new File(fileString);
docFile = new File(fileString);
pdfFile = new File(fileName+ ".pdf");
}
/**
*  转PDF⽅法(LibleOffice插件)
*
* @param file docFile, pdfFile
*
*/
public  void doc2pdf() throws Exception {
String LibreOffice_HOME = getLibreOfficeHome();
String fileName = Name();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(new Date()) + "⽂件" + Name());        System.out.println(fileName.substring(fileName.lastIndexOf(".")));
if (fileName.substring(fileName.lastIndexOf(".")).equalsIgnoreCase(".txt")) {
System.out.println("处理txt⽂件");
new DocConverter().TXTHandler(docFile);
}
DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration();
// libreOffice的安装⽬录
configuration.setOfficeHome(new File(LibreOffice_HOME));
// 端⼝号
configuration.setPortNumber(8100);
configuration.setTaskExecutionTimeout(1000 * 60 * 25L);
//          设置任务执⾏超时为10分钟
configuration.setTaskQueueTimeout(1000 * 60 * 60 * 24L);
//          设置任务队列超时为24⼩时
OfficeManager officeManager = configuration.buildOfficeManager();
officeManager.start();
System.out.println(new Date().toString() + "开始转换......");
OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
try {
} catch (Exception e) {
e.printStackTrace();
System.out.println("转换失败");
} finally {
officeManager.stop();
}
System.out.println(new Date().toString() + "转换结束....");
}
static String loadStream(InputStream in) throws IOException {
int ptr = 0;
in = new BufferedInputStream(in);
StringBuffer buffer = new StringBuffer();
while ((ptr = in.read()) != -1) {
buffer.append((char) ptr);
}
String();
}
/**
* 打开libreOffice服务的⽅法
*
* @return
* @return
*/
public String getLibreOfficeHome() {
String osName = Property("os.name");
if (Pattern.matches("Linux.*", osName)) {
//获取linux系统下libreoffice主程序的位置
//这⾥需要返回libreOffice安装路径,我的路径写在了⾃⼰建的Properties⽂件⾥            Properties("libre_office_linux");
} else if (Pattern.matches("Windows.*", osName)) {
//获取windows系统下libreoffice主程序的位置
//这⾥需要返回libreOffice安装路径,我的路径写在了⾃⼰建的Properties⽂件⾥            Properties("libre_office_windows");
}
return null;
}
//测试⽅法
public static void main(String[] args) throws Exception {
String printfPDFPath = "E:/Labor/tplfile/党建交接.docx";
printfPDFPath =  place("/", "\\\\");
DocConverter demo = new  DocConverter(printfPDFPath);
demo.doc2pdf();
}
/**
* 转换txt⽂件编码的⽅法
*
* @param file
* @return
*/
public File TXTHandler(File file) {
//或GBK
String code = "gb2312";
byte[] head = new byte[3];
try {
InputStream inputStream = new FileInputStream(file);
if (head[0] == -1 && head[1] == -2) {
code = "UTF-16";
} else if (head[0] == -2 && head[1] == -1) {
code = "Unicode";
} else if (head[0] == -17 && head[1] == -69 && head[2] == -65) {
code = "UTF-8";
}
inputStream.close();
System.out.println(code);
if (code.equals("UTF-8")) {
return file;
}
String str = adFileToString(file, code);
FileUtils.writeStringToFile(file, str, "UTF-8");
System.out.println("转码结束");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return file;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。