java中基于freemarker的word转pdf
java使用freemarker生成word文档,把word转为pdf输出
·
java中基于freemarker的word转pdf
/**
* 使用FreeMarker自动生成Word文档
*
* @param dataMap 生成Word文档所需要的数据
* @param fileName 生成Word文档的全路径名称
* @param templateName 模板文档的名称
*/
public File generateWord(final Map<String, Object> dataMap, final String fileName, final String templateName) {
// 设置FreeMarker的版本和编码格式
final Configuration configuration = FreeMakerUtil.getConfiguration(HtmlConstants.FTL_PATH);
/* Get the template (uses cache internally) */
//如果初始配置文件没有加载到,直接结束并提醒
if (configuration == null) {
log.info("freemaker初始化配置加载失败!");
return null;
}
File tempFile = null;
Writer out = null;
try {
tempFile = Files.createTempFile(fileName, ".doc").toFile();
final Template template = configuration.getTemplate(templateName);
// 创建一个Word文档的输出流
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(tempFile), "UTF-8"));
//FreeMarker使用Word模板和数据生成Word文档
template.process(dataMap, out);
} catch (final Exception e) {
log.info("自动生成Word文档-----报错" + e.getMessage());
} finally {
IOUtils.closeQuietly(out);
}
return tempFile;
}
@Override
public void exportParamPDF(final HttpServletResponse response, final HttpServletRequest request, final Long boRtcCheckRecordId) {
//模板名称
final String templateName = "unannouncedInspectionPDF.ftl";
//导出文件名称
final String fileName = CommonConstants.FLY_CHECK + sdf2.format(new Date());
final HashMap checkMap = this.getHashMap(boRtcCheckRecordId);
File docFile = null;
response.setCharacterEncoding("UTF-8");
final InputStream input = null;
OutputStream outs = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
String PDFfileName = null;
try {
//读写到流中
docFile = this.generateWord(checkMap, fileName, templateName);
//word⽂档转pdf⽂档
PDFfileName = Xml2Word2PdfUtil.word2Pdf(docFile.getCanonicalPath(), null);
log.info("PDF⽂件临时地址:" + PDFfileName);
//String outputFileName = fileName + ".doc";
final String substring = PDFfileName.substring(PDFfileName.indexOf(CommonConstants.FEI), PDFfileName.indexOf(CommonConstants.FEI) + IntConstants.N12).concat(".pdf");
String outputFileName = substring;
response.setCharacterEncoding("UTF-8");
// 解决中文文件名下载后乱码的问题
outputFileName = URLEncoder.encode(outputFileName, "utf-8");
outputFileName = outputFileName.replace("+", "%20");
//文件导出格式
response.setContentType("application/octet-stream;charset=utf-8");
outs = response.getOutputStream();
bos = new BufferedOutputStream(outs);
//设置文件头
//response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + outputFileName);
response.setHeader("Content-Disposition", "attachment;filename=\"" + outputFileName + "\"; filename*=utf-8''" + outputFileName);
final File file = new File(PDFfileName);
bis = new BufferedInputStream(new FileInputStream(file));
int bytesRead = 0;
// 输⼊流进⾏先读,然后⽤输出流去写,下⾯⽤的是缓冲输⼊输出流
final byte[] buffer = new byte[512];
while ((bytesRead = bis.read(buffer)) != -1) {
bos.write(buffer, 0, bytesRead);
}
bos.flush();
} catch (Exception e) {
throw new BusinessException(ExceptionEnum.ERROR_SUPERVISE_PLAN_DOWNLOAD.getCode(),
ExceptionEnum.ERROR_SUPERVISE_PLAN_DOWNLOAD.getMessage());
} finally {
IOUtils.closeQuietly(input);
IOUtils.closeQuietly(outs);
IOUtils.closeQuietly(bos);
IOUtils.closeQuietly(bis);
//下载完成删除临时⽂件
boolean flag = false;
boolean flagPDF = false;
flag = docFile.getAbsoluteFile().delete();
final File filePDF = new File(PDFfileName);
flagPDF = filePDF.getAbsoluteFile().delete();
log.info("临时WORD⽂件是否删除成功:" + flag);
log.info("临时PDF⽂件是否删除成功:" + flagPDF);
}
}
package com.chinamobile.cmss.dtai.common.utils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.chinamobile.cmss.cpms.common.base.exception.BusinessException;
import com.chinamobile.cmss.dtai.common.exception.ExceptionEnum;
import freemarker.template.Configuration;
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;
import lombok.extern.slf4j.Slf4j;
/**
* @Author xzy
* @Date 2022/11/29 22:56
* @Version
**/
@Slf4j
public class Xml2Word2PdfUtil {
private static Configuration configuration = null;
/**
* 初始化配置并设置默认编码UTF-8
*/
static {
configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
}
/**
* @Description: 验证aspose.word组件是否授权:⽆授权的⽂件有⽔印标记
*/
public static boolean getLicense() {
boolean result = false;
try {
// license.xml放在src/main/resources文件夹下
final InputStream is = Xml2Word2PdfUtil.class.getClassLoader().getResourceAsStream("license.xml");
final License aposeLic = new License();
aposeLic.setLicense(is);
result = true;
} catch (Exception e) {
log.error(e.getMessage());
}
return result;
}
/**
* 使⽤aspose.word把word⽂档转为pdf⽂档
*
* @param sourceFile word⽂档绝对路径(如:D:/templates/order.doc)
* @param destFile pdf⽂档绝对路径(如:D:/templates/order.pdf)
*/
public static String word2Pdf(final String sourceFile, String destFile) {
destFile = StringUtils.isEmpty(destFile) ? sourceFile.replace(".doc", ".pdf") : destFile;
// 验证License 若不验证则转化出的pdf⽂档会有⽔印产⽣
if (!getLicense()) {
throw new BusinessException(ExceptionEnum.ERROR_PDF_LICENSE_DATA.getCode(), ExceptionEnum.ERROR_PDF_LICENSE_DATA.getMessage());
}
try {
final long old = System.currentTimeMillis();
final File file = new File(destFile); //新建⼀个空⽩pdf⽂档
final FileOutputStream os = new FileOutputStream(file);
////解决Linux中⽂⽀持问题,注意,如果部署到新服务器,需要copy window下的字体到Linux服务器字体⽂件夹中。
//String osName = System.getProperties().getProperty("os.name");
//if (osName.equals("Linux")) {
// FontSettings.setFontsFolder("/usr/share/fonts" + File.separator, true);
//}
final Document doc = new Document(sourceFile);//通过sourceFile创建word⽂档对象
doc.save(os, SaveFormat.PDF);
os.close();
final long now = System.currentTimeMillis();
// 转化用时
log.info("pdf转换成功,共耗时:" + ((now - old) / 1000.0) + "秒");
} catch (Exception e) {
log.error(e.getMessage());
throw new BusinessException(ExceptionEnum.ERROR_PDF_FAILED_DATA.getCode(), ExceptionEnum.ERROR_PDF_FAILED_DATA.getMessage());
}
return destFile;
}
}
更多推荐
所有评论(0)