通过itext实现html转pdf

使用到的jar包:【支持识别CSS换行】

<!-- pdf生成 itext工具包 -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.4.2</version>
</dependency>
<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>flying-saucer-pdf-itext5</artifactId>
    <version>9.1.16</version>
</dependency>
<!-- freemarke引擎依赖引入 -->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.29</version>
</dependency>

PDFUtil工具类


package demo.util;

import com.itextpdf.text.pdf.BaseFont;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;

/**
 * @author
 * @description: 根据html模板生成pdf工具类
 * @date 2019/10/19
 */

public class PDFUtil {

    private String tempFilePath;
    private String tempFileName;

    public PDFUtil() {
    }

    public PDFUtil(String tempFilePath, String tempFileName) {
        this.tempFilePath = tempFilePath;
        this.tempFileName = tempFileName;
    }

    public String getTempFilePath() {
        return tempFilePath;
    }

    public void setTempFilePath(String tempFilePath) {
        this.tempFilePath = tempFilePath;
    }

    public String getTempFileName() {
        return tempFileName;
    }

    public void setTempFileName(String tempFileName) {
        this.tempFileName = tempFileName;
    }
    /**
     * 日志
     */
    private static Logger logger = LoggerFactory.getLogger(PDFUtil.class);

    /**
     * 填充模板
     *
     * @param paramMap
     * @throws Exception
     */
    public FileItem fillTemplate(Map<String, Object> paramMap) throws Exception {
        File modelFile = new File(tempFilePath);
        if (!modelFile.exists()) {
            modelFile.mkdirs();
        }

        Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
        configuration.setDirectoryForTemplateLoading(modelFile);
        configuration.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_23));
        configuration.setDefaultEncoding("UTF-8");  //这个一定要设置,不然在生成的页面中 会乱码

        //获取或创建一个模版。
        Template template = configuration.getTemplate(tempFileName);

        StringWriter stringWriter = new StringWriter();
        BufferedWriter writer = new BufferedWriter(stringWriter);
        template.process(paramMap, writer); //把值写进模板
        String htmlStr = stringWriter.toString();

        writer.flush();
        writer.close();

        String tmpPath = tempFilePath + "temp";
        File tmepFilePath = new File(tmpPath);
        if (!tmepFilePath.exists()) {
            tmepFilePath.mkdirs();
        }

        String tmpFileName = System.currentTimeMillis() + ".pdf";
        FileItemFactory factory = new DiskFileItemFactory(16, null);
        ((DiskFileItemFactory) factory).setDefaultCharset("utf-8");
        FileItem item = factory.createItem(tmpFileName, "application/pdf", true, tmpFileName);
        OutputStream outputFile = item.getOutputStream();
        htmlToPdf(outputFile, htmlStr);
        outputFile.close();
        return item;
    }

    /**
     * 生成html模板
     *
     * @param content
     * @return
     */
    public String createdHtmlTemplate(String content) {
        String fileName = tempFilePath + "/" + tempFileName;
        //使用try-with-resource方式关流
        try(PrintStream printStream = new PrintStream(new FileOutputStream(fileName))) {
            File file = new File(tempFilePath);
            if (!file.isDirectory()) {
                file.mkdir();
            }

            file = new File(fileName);
            if (!file.isFile()) {
                boolean sign  = file.createNewFile();
                if(! sign){
                    logger.info("file.createNewFile失败");
                }
            }

            //将HTML文件内容写入文件中
            printStream.println(content);
            printStream.flush();
            logger.info("生成html模板成功!");
        } catch (Exception e) {
            logger.info(e.getMessage());
        }

        return fileName;
    }

    /**
     * @throws IOException
     * @Param: [url]
     * @return: java.lang.String
     * 文章内容获取
     */
    public static String getHTML(String pageURL, String encoding) {
        StringBuilder pageHTML = new StringBuilder();
        try {
            URL url = new URL(pageURL);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestProperty("User-Agent", "MSIE&nbsp;7.0");
            BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding));
            String line = null;
            while ((line = br.readLine()) != null) {
                pageHTML.append(line);
                pageHTML.append("\r\n");
            }
            connection.disconnect();
        } catch (Exception e) {
            logger.info(e.getMessage());
        }
        return pageHTML.toString();

    }

    /**
     * 填充模板 输出文件流
     *
     * @param paramMap
     * @throws Exception
     */
    public FileItem fillTemp(Map<String, Object> paramMap) throws Exception {
        File modelFile = new File(tempFilePath);
        if (!modelFile.exists()) {
            modelFile.mkdirs();
        }
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
        configuration.setDirectoryForTemplateLoading(modelFile);
        configuration.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_23));
        configuration.setDefaultEncoding("UTF-8"); //这个一定要设置,不然在生成的页面中 会乱码
        //获取或创建一个模版。
        Template template = configuration.getTemplate(tempFileName);

        StringWriter stringWriter = new StringWriter();
        BufferedWriter writer = new BufferedWriter(stringWriter);
        template.process(paramMap, writer); //把值写进模板

        String htmlStr = stringWriter.toString();
        writer.flush();
        writer.close();

        String tmpPath = tempFilePath + "temp";
        File tmepFilePath = new File(tmpPath);
        if (!tmepFilePath.exists()) {
            tmepFilePath.mkdirs();
        }
        String tmpFileName = System.currentTimeMillis() + ".html";
        FileItemFactory factory = new DiskFileItemFactory(16, null);
        FileItem item = factory.createItem(tmpFileName, "text/html", true, tmpFileName);
        OutputStream output = item.getOutputStream();
        output.write(htmlStr.getBytes());
        output.close();
        return item;
    }

    /**
     * 将HTML转成PD格式的文件。html文件的格式比较严格
     *
     * @param os
     * @param htmlContext
     * @throws Exception
     */
    // <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
    public static void htmlToPdf(OutputStream os, String htmlContext) throws Exception {

        ITextRenderer iTextRenderer = new ITextRenderer();
        iTextRenderer.setDocumentFromString(htmlContext);

        //解决中文编码
        ITextFontResolver fontResolver = iTextRenderer.getFontResolver();

        //fontResolver.addFont("/static/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        if ("linux".equals(getCurrentOperationSystem())) {
            fontResolver.addFont("/usr/share/fonts/lyx/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        } else {
            fontResolver.addFont("c:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        }

        iTextRenderer.layout();
        iTextRenderer.createPDF(os);
        os.flush();
        os.close();
    }

    private static String getCurrentOperationSystem() {
        return System.getProperty("os.name").toLowerCase();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值