Freemarker + flying-saucer-pdf 基于IText2.17实现HTML文档转换成PDF

一、引入依赖

        <dependency>
            <groupId>org.freemarkergroupId>
            <artifactId>freemarkerartifactId>
            <version>2.3.28version>
        dependency>
        <dependency>
            <groupId>org.xhtmlrenderergroupId>
            <artifactId>flying-saucer-pdfartifactId>
            <version>9.1.5version>
        dependency>

二、创建Freemarker模板(test.ftl)

		<html>
		<head>
		    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><br/>
		    <title>测试title>
		head>
		
		<body style="font-family:FangSong;" >
		    <table border="1">
		        <#list itemList as item>
		            <tr>
		                <th>${item.id}th>
		                <th>${item.name}th>
		            tr>
		        #list>
		    table>
		    <img src="data:image/jpg;base64,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" alt="" width="120" height="120"/>
		body>
		html>

四、创建转换工具

package com.test.demo.pdf;

import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.BaseFont;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;

/**
 * HTML转换成PDF文件
 * @Author LinCH
 **/
public class HtmlToPdfUtils {

    private static Logger LOG = LoggerFactory.getLogger(HtmlToPdfUtils.class);

    /**
     * 生成PDF文档字节流
     * @param template Freemarker模板
     * @param variables 参数
     * @param fontPaths 字体文件路径(文档中存在中文一定要设置一个支持中文的字体,且在这边必须将该字体的文件设置进来,否则中文无法显示)
     * @return PDF文档字节流
     * @throws IOException
     * @throws DocumentException
     * @throws TemplateException
     */
    public static ByteArrayOutputStream generatePdfStream(String template, Map<String, Object> variables, String[] fontPaths) throws IOException, DocumentException, TemplateException {
        String htmlStr = generateHtmlStr(template, variables);
        LOG.debug(htmlStr);
        ITextRenderer renderer = new ITextRenderer();
        ITextFontResolver fontResolver = renderer.getFontResolver();
        for(String fontPath : fontPaths){
            fontResolver.addFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        }
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        renderer.setDocumentFromString(htmlStr);
        renderer.layout();
        renderer.createPDF(os);
        return os;
    }

    /**
     * 使用Freemarker生成HTML文档
     * @param template Freemarker模板
     * @param variables 参数
     * @return 生成的HTML文档字符串
     * @throws IOException
     * @throws TemplateException
     */
    public static String generateHtmlStr(String template, Map<String, Object> variables) throws IOException, TemplateException {
        Configuration config = new Configuration();
        config.setClassForTemplateLoading(FreemarkerUtils.class, "/");
        Template tp = config.getTemplate(template);
        StringWriter stringWriter = new StringWriter();
        BufferedWriter writer = new BufferedWriter(stringWriter);
        tp.setEncoding("UTF-8");
        tp.process(variables, writer);
        String htmlStr = stringWriter.toString();
        writer.flush();
        writer.close();
        return htmlStr;
    }

}

四、生成并下载PDF文档

package com.test.demo.web.controller;

import com.lowagie.text.DocumentException;
import com.test.demo.pdf.HtmlToPdfUtils;
import com.test.demo.pdf.Item;

import freemarker.template.TemplateException;

import org.springframework.core.io.ClassPathResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

/**
 *
 * @Author LinCH
 **/
@Controller
public class TestController {

    public final static String USER_AGENT = "USER-AGENT";
    public final static String MSIE = "MSIE";
    public final static String TRIDENT = "Trident";
    public final static String MOZILLA = "Mozilla";
    public final static String UTF8 = "UTF-8";
    public final static String ISO88591 = "ISO8859-1";

    @RequestMapping("/fun1")
    public ResponseEntity<byte[]> fun1(HttpServletRequest request) throws DocumentException, TemplateException, IOException {

        Map<String, Object> map = new HashMap<>();
        List<Item> itemList = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            itemList.add(new Item("id" + i, "张三aaaaaaaaa" + i));
        }
        map.put("itemList", itemList);

        ByteArrayOutputStream os = HtmlToPdfUtils.generatePdfStream("test.ftl",
            map, new String[]{new ClassPathResource("/simfang.ttf").getPath()});

        HttpHeaders headers = new HttpHeaders();

        String codedfilename = null;
        String agent = request.getHeader(USER_AGENT);
        // IE
        if (null != agent && -1 != agent.indexOf(MSIE) || null != agent && -1 != agent.indexOf(TRIDENT)) {
            String name = java.net.URLEncoder.encode("PDF测试.pdf", UTF8);
            codedfilename = name;
        } else if (null != agent && -1 != agent.indexOf(MOZILLA)) {
            codedfilename = new String("PDF测试.pdf".getBytes(UTF8), ISO88591);
        }

        headers.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + codedfilename + "\"");
        HttpStatus statusCode = HttpStatus.OK;
        ResponseEntity<byte[]> entity = new ResponseEntity<>(os.toByteArray(), headers, statusCode);
        return entity;

    }

}

五、备注

	IText在2.17以后的版本开源协议为AGPL,商用时需谨慎,目前还是使用2.17版本。

你可能感兴趣的:(Java,SpringBoot,PDF)