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











Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐