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、需要在本地存放 字体 文件,本例使用的是 黑体字。
若对你有所帮助,请评论或点赞!