项目需要实现生成PDF文件,从网上查阅资料,很多都是基于iText5版本实现的,无法查询到最新版本的实现方案,故通过本文章记录实现过程。 实现方案为 通过HTML模板,然后再java中动态拼接or添加HTML节点内容,然后通过HtmlConverter.convertToPdf 实现PDF生成,本方案支持导出图片
-
添加依赖
xml<!-- iText 7 Core --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext7-core</artifactId> <version>9.1.0</version> <type>pom</type> </dependency> <!-- Html2Pdf 模块 --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>html2pdf</artifactId> <version>6.1.0</version> </dependency>
-
测试类方法
javapublic static void main(String[] args) throws IOException { // 从文件读取HTML文件内容 String html = FileUtil.readUtf8String("C:/Users/xxxx/Desktop/report.html"); // 输出PDF文件路径 String dest = "D://generatePDF.pdf"; ConverterProperties properties = new ConverterProperties(); properties.setCharset("UTF-8"); // 设置字体提供器 FontProvider fontProvider = new FontProvider(); fontProvider.addStandardPdfFonts(); // 添加标准PDF字体 String fontPath = "C:/Windows/Fonts/simsun.ttc,1"; //你的字体路径 fontProvider.getFontSet().addFont(fontPath, PdfEncodings.IDENTITY_H); properties.setFontProvider(fontProvider); // 设置页眉 PdfDocument pdfDocument = new PdfDocument(new PdfWriter(dest)); String headerText = "xxxxssasa中文xxxss"; // 设置动态页眉内容 //为pdfDocument添加一个事件处理程序,用于在每页结束时添加页眉 pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new Header(headerText, fontPath)); // 转换HTML到PDF HtmlConverter.convertToPdf(html, pdfDocument, properties); }
-
通过事件处理 添加页眉
java
import java.io.IOException;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.event.AbstractPdfDocumentEvent;
import com.itextpdf.kernel.pdf.event.AbstractPdfDocumentEventHandler;
import com.itextpdf.kernel.pdf.event.PdfDocumentEvent;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.borders.Border;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.properties.HorizontalAlignment;
import com.itextpdf.layout.properties.TextAlignment;
import com.itextpdf.layout.properties.VerticalAlignment;
public class Header extends AbstractPdfDocumentEventHandler {
private String headerText;
private String fontPath;
public Header(String headerText, String fontPath) {
this.headerText = headerText;
this.fontPath = fontPath;
}
@Override
protected void onAcceptedEvent(AbstractPdfDocumentEvent abstractPdfDocumentEvent) {
PdfDocumentEvent docEvent = (PdfDocumentEvent)abstractPdfDocumentEvent;
PdfDocument pdfDoc = docEvent.getDocument();
PdfPage page = docEvent.getPage();
Rectangle pageSize = page.getPageSize();
float width = PageSize.A4.getWidth() - 60;
// 获取当前页码
int pageNumber = pdfDoc.getPageNumber(page);
// 创建 Document 对象
Document document = new Document(pdfDoc);
// 表格 一行两列
Table table = new Table(1);
table.setWidth(width);
// 名称
PdfFont font = null; // 设置字体
try {
font = PdfFontFactory.createFont(fontPath);
} catch (IOException e) {
throw new RuntimeException(e);
}
Paragraph nameP =
new Paragraph(String.format("%s - 页码: %d", headerText, pageNumber)).setFont(font).setFontSize(10); // 使用传入的页眉文本内容和字体
Cell cell = new Cell().add(nameP).setHorizontalAlignment(HorizontalAlignment.RIGHT)
.setVerticalAlignment(VerticalAlignment.MIDDLE).setTextAlignment(TextAlignment.RIGHT)
.setBorderTop(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderRight(Border.NO_BORDER);
table.addCell(cell);
// 设置表格的位置 页眉处
table.setFixedPosition(pageSize.getLeft(), pageSize.getTop() - 30, width);
// 添加表格到文档
document.add(table);
}
}
结尾: 如果有需要生成页脚,可自行研究