java导出PDF(freemarker模板导出word,再把word使用aspose-words-15.8.0-jdk16转成PDF)


import com.aspose.words.Document;
import com.aspose.words.License;
import freemarker.template.Configuration;
import freemarker.template.Template;
import sun.misc.BASE64Encoder;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

/*******************************************
 * 通过ftl模板生成新的word工具类(freemarker)
 * 新加特性---生成的word转成pdf下载
 * @Package 
 * @Author 
 * @Date 2021/6/26 11:27 修改时间2021/6/29 11:27
 * @Version V2.0
 *******************************************/
public class WordUtilsByfreemarker {
    //配置信息,代码本身写的还是很可读的,就不过多注解了
    private static Configuration configuration = null;

    static {
        configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");

    }

    private WordUtilsByfreemarker() {
        throw new AssertionError();
    }

    /*******************************************
     * 由之前的导出word转成pdf方法(如果需要还原word,则把注释中的word相关解开,转pdf的注释即可)
     * @Package com.augurit.agcloud.beijing.utils
     * @Author 梁毓文
     * @Date 2021/6/29 11:27
     * @Version V2.0
     *******************************************/
    public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map, String title, String ftlFile) throws Exception {
        // map为数据
        String path = request.getSession().getServletContext().getRealPath("");
        configuration.setDirectoryForTemplateLoading(new File(path));

        Template freemarkerTemplate = configuration.getTemplate(ftlFile);
        File file = null;
        InputStream fin = null;
        ServletOutputStream out = null;//word流
        ServletOutputStream os = null;//pdf流
        try {
            // 调用工具类的createDoc方法生成Word文档  
            file = createDoc(map, freemarkerTemplate);
            fin = new FileInputStream(file);

            response.setCharacterEncoding("utf-8");
            response.setContentType("application/msword");

            DateFormat dft = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
            String dat = dft.format(new Date());
            // 设置浏览器以下载的方式处理该文件名  
            String fileName = title + dat + ".pdf";//pdf文件名
            //String fileName = title + dat + ".doc";//word文件名
            response.setHeader("Content-Disposition", "attachment;filename="
                    .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));

            /**新加的word转pdf-----start*/
            if (!getLicense()) { // 验证License 若不验证则转化出的pdf文档会有水印产生
                return;
            }
            os = response.getOutputStream();
            Document doc = new Document(fin);
            doc.save(os, com.aspose.words.SaveFormat.PDF);//全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换
            /**新加的word转pdf-----end*/

            //out = response.getOutputStream();//旧的导出word文档流

            byte[] buffer = new byte[512];  // 缓冲区  
            int bytesToRead = -1;
            // 通过循环将读入的Word文件的内容输出到浏览器中
            while ((bytesToRead = fin.read(buffer)) != -1) {
                //out.write(buffer, 0, bytesToRead);//旧的输出word文档
                os.write(buffer, 0, bytesToRead);//word转pdf后输出
            }
        } finally {
            if (fin != null) fin.close();
            if (out != null) out.close();
            if (os != null) os.close();
            if (file != null) file.delete(); // 删除临时文件file.delete()
        }
    }
    private static boolean getLicense() {
        boolean result = false;
        try {
            InputStream is = PdfUtil.class.getClassLoader().getResourceAsStream("license.xml"); // license.xml应放在..\WebRoot\WEB-INF\classes路径下
            License aposeLic = new License();
            aposeLic.setLicense(is);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    private static File createDoc(Map dataMap, Template template) {
        String name = "sellPlan.doc";
        File f = new File(name);
        Template t = template;
        try {
            // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开  
            Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
            t.process(dataMap, w);
            w.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        return f;
    }

    //获得图片的base64码
    public static String getImageBase(String src) throws Exception {
        if (src == null || src == "") {
            return "";
        }
        File file = new File(src);
        if (!file.exists()) {
            return "";
        }
        InputStream in = null;
        byte[] data = null;
        try {
            in = new FileInputStream(file);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data);
    }

}

ftl模板可以本地创建word,自定义好格式,导出xml再修改后缀为ftl放到项目里即可使用。

ftl功能强大,支持进行循环,判空、插入图片(base64)等(具体模板参考在我主页下载有哦)

java导出PDF(freemarker模板导出word,再把word使用aspose-words-15.8.0-jdk16转成PDF)_第1张图片
java导出PDF(freemarker模板导出word,再把word使用aspose-words-15.8.0-jdk16转成PDF)_第2张图片

调用工具类

Map map = new HashMap() {{
                put("planType", opuUserInfo.getPlanType());
}};
WordUtilsByfreemarker.exportMillCertificateWord(req, resp, map, opuUserInfo.getUserNickName()+"("+opuUserInfo.getUserCode()+")", "模板.ftl");

你可能感兴趣的:(java,word,java,pdf,spring)