使用itext将HTML 生成PDF文件

1、使用itext将HTML模板生成PDF文件

HTML模板注意事项:

  • 所有标签按语法正确闭合,否则会报错
  • table用border设置表格
  • 如果下载到空白文件,看看整体XML的宽度
  • width使用%来设置,itext解析%

2、项目需求


1.实现将html 内容(含中文) 生成pdf
2.将现有的png格式图片 合入 pdf 中的特定位置
3.将base64 编码的图腾 合入 pdf 中的特定位置 

3、实现效果

4、实现功能

1.所需jar 包


        <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.11</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.itextpdf.tool/xmlworker -->
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.11</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

2.代码功能实现

package com.sinosoft.cloudclaim.utils;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.sinosoft.cloudclaim.investigation.utility.Base64;

import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.nio.charset.Charset;

/**
 * @Description:
 * @author: YaoGX
 * @version: 1.0.0
 * @createTime: 2021/7/27 19:46
 */
public class HtmlToPDF {

    private static final String FONT = "D:\\simhei.ttf";


    public static void main(String[] args) {
        new HtmlToPDF().createPdf();
    }

    /*
     * 生成PDF
     * */
    public void createPdf() {
        try {
//            BaseFont bfChinese = BaseFont.createFont();
            //直接引用 下载好的字体文件
//            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            BaseFont bfChinese = BaseFont.createFont("D:\\simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            Font font = new Font(bfChinese, 12, Font.NORMAL);

            Document document = new Document(PageSize.A4, 10, 10, 10, 10);
            PdfWriter mPdfWriter = PdfWriter.getInstance(document, new FileOutputStream("D://htmltest.pdf"));
            document.open();

            document.add(new Paragraph("创建pdf文件.支持中文......创建pdf文件.支持中文创建pdf文件. 支持中文创建pdf文件. 支持中文创建pdf文件. 支持中文创建pdf文件. 支持中文", font));

            String s = getHtml();//html 标签内容
            ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes());
            XMLWorkerHelper.getInstance().parseXHtml(mPdfWriter, document, is, Charset.forName("UTF-8"), new AsianFontProvider());

            //将图片合成pdf
            Image image = Image.getInstance("D:\\data\\01.jpg");

            image.scalePercent(10);// 控制图片大小
            image.setAbsolutePosition(200, 500);
            document.add(image);

            //base64 编码的图片类型
            Image image2 = Image.getInstance(Base64.decode(TESTEVSCHOP));

            image2.scalePercent(20);// 控制图片大小
            image2.setAbsolutePosition(400, 500);
            document.add(image2);


            document.close();
            mPdfWriter.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     *  HTML 脚本
     * @author: YaoGX
     * @Date: 2021/7/28 0:39
     */
    public static String getHtml() {

        StringBuffer html = new StringBuffer();
        html.append("<div style='color:green;font-size:20px;'>你好世界!hello world !</div>");
        html.append("<span style='color:red'>what are you 弄啥咧!</span>");
        html.append("<h1>标题</h1>");
        html.append("<table>");
        html.append("<tr>");
        html.append("<th>序号</th>");
        html.append("<th>用户名</th>");
        html.append("<th>性别</th>");
        html.append("</tr>");
        html.append("<tr>");
        html.append("<td>1</td>");
        html.append("<td>fengxing</td>");
        html.append("<td>男</td>");
        html.append("</tr>");
        html.append("<tr>");
        html.append("<td>2</td>");
        html.append("<td>admin</td>");
        html.append("<td>女</td>");
        html.append("</tr>");


        html.append("</table>");
        return html.toString();

    }

    /**
     * 
     * @author:
     * @Date: 2021/7/28 0:39
     */
    public static final String TESTEVSCHOP = "iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJAQMAAADaX5RTAAAAA3NCSVQICAjb4U/gAAAABlBMVEX///+ZmZmOUEqyAAAAAnRSTlMA/1uRIrUAAAAJcEhZcwAACusAAArrAYKLDVoAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDkvMjAvMTIGkKG+AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAAB1JREFUCJljONjA8LiBoZyBwY6BQQZMAtlAkYMNAF1fBs/zPvcnAAAAAElFTkSuQmCC";


}

 3. 样式渲染类

package com.sinosoft.cloudclaim.utils;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Font;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;

public class AsianFontProvider extends XMLWorkerFontProvider {


    @Override
    public Font getFont(final String fontname, final String encoding, final boolean embedded, final float size,
                        final int style, final BaseColor color) {
        BaseFont bfChinese = null;
        try {
            bfChinese = BaseFont.createFont("D:\\simhei.ttf", BaseFont.IDENTITY_H,  BaseFont.NOT_EMBEDDED);
        } catch (Exception e) {
            e.printStackTrace();
        }
        Font font = new Font(bfChinese, size, style, color);
        font.setColor(color);
        return font;
    }
}

 

5、需要在本地存放 字体 文件,本例使用的是 黑体字。

 

若对你有所帮助,请评论或点赞!