以下是一个使用 iText 7 库实现 PDF 导出的 Java 示例,包含自定义页眉、文字、表格和图片功能:
添加 Maven 依赖
<dependencies>
<!-- iText 7 Core -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.5</version>
</dependency>
<!-- PDF Layout 扩展 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
<version>7.2.5</version>
</dependency>
</dependencies>
Java 示例代码
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.borders.SolidBorder;
import com.itextpdf.layout.element.*;
import com.itextpdf.layout.property.HorizontalAlignment;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.UnitValue;
import java.io.File;
import java.io.IOException;
public class PdfExportDemo {
public static void main(String[] args) throws IOException {
// 1. 创建PDF文档
String dest = "demo.pdf";
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
// 添加自定义页眉处理器
HeaderEventHandler handler = new HeaderEventHandler();
pdf.addEventHandler(PdfDocumentEvent.START_PAGE, handler);
// 2. 添加文字内容
PdfFont font = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H");
Paragraph title = new Paragraph("PDF导出示例")
.setFont(font)
.setFontSize(20)
.setBold()
.setTextAlignment(TextAlignment.CENTER);
document.add(title);
Paragraph content = new Paragraph("这是一个使用iText 7创建的PDF文档示例,展示了如何添加自定义页眉、文字、表格和图片。")
.setFont(font)
.setFontSize(12)
.setMarginTop(20);
document.add(content);
// 3. 添加表格
Table table = new Table(UnitValue.createPercentArray(new float[]{2, 3, 2}))
.setWidth(UnitValue.createPercentValue(80))
.setHorizontalAlignment(HorizontalAlignment.CENTER)
.setMarginTop(20);
// 表头
table.addHeaderCell(createCell("ID", true, font));
table.addHeaderCell(createCell("产品名称", true, font));
table.addHeaderCell(createCell("价格", true, font));
// 表格内容
table.addCell(createCell("001", false, font));
table.addCell(createCell("Java编程指南", false, font));
table.addCell(createCell("¥89.00", false, font));
table.addCell(createCell("002", false, font));
table.addCell(createCell("PDF生成教程", false, font));
table.addCell(createCell("¥59.00", false, font));
document.add(table);
// 4. 添加图片
String imagePath = "logo.png"; // 替换为实际图片路径
if (new File(imagePath).exists()) {
Image img = new Image(ImageDataFactory.create(imagePath))
.setWidth(150)
.setHorizontalAlignment(HorizontalAlignment.CENTER)
.setMarginTop(30);
document.add(img);
} else {
System.out.println("图片文件不存在: " + imagePath);
}
// 5. 关闭文档
document.close();
System.out.println("PDF生成成功: " + dest);
}
// 创建表格单元格辅助方法
private static Cell createCell(String text, boolean isHeader, PdfFont font) {
Cell cell = new Cell().add(new Paragraph(text).setFont(font));
if (isHeader) {
cell.setBackgroundColor(ColorConstants.LIGHT_GRAY);
cell.setBold();
}
cell.setBorder(new SolidBorder(1));
cell.setPadding(5);
return cell;
}
// 自定义页眉处理器
static class HeaderEventHandler implements IEventHandler {
@Override
public void handleEvent(Event event) {
PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
PdfPage page = docEvent.getPage();
Rectangle pageSize = page.getPageSize();
PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), docEvent.getDocument());
Canvas canvas = new Canvas(pdfCanvas, pageSize);
// 绘制页眉文本
Paragraph header = new Paragraph("公司机密文档 - 2023年度报告")
.setFontSize(10)
.setFontColor(ColorConstants.DARK_GRAY)
.setTextAlignment(TextAlignment.CENTER)
.setFixedPosition(0, pageSize.getTop() - 30, pageSize.getWidth());
// 绘制页眉分隔线
LineSeparator line = new LineSeparator(new SolidBorder(0.5f));
line.setWidth(pageSize.getWidth() - 60);
line.setMarginTop(5);
line.setHorizontalAlignment(HorizontalAlignment.CENTER);
canvas.add(header);
canvas.add(line);
canvas.close();
}
}
}
功能说明
自定义页眉:
- 使用
HeaderEventHandler
实现在每页顶部添加页眉 - 包含居中文本和分隔线
- 通过
PdfDocumentEvent.START_PAGE
事件触发
- 使用
文字内容:
- 添加标题和正文段落
- 支持中文字体(使用
STSong-Light
) - 设置字体大小、加粗、对齐方式等样式
表格功能:
- 创建3列表格(ID、产品名称、价格)
- 设置表头背景色和单元格边框
- 控制表格宽度和页面居中
图片插入:
- 从文件系统加载图片(需替换实际路径)
- 设置图片宽度和居中显示
- 添加错误处理(文件不存在时提示)
使用说明
替换图片路径:
String imagePath = "your_image_path.png"; // 修改为实际图片路径
调整中文字体:
- 如需使用其他中文字体,需引入字体文件:
PdfFont font = PdfFontFactory.createFont("font_path.ttf", PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);
运行程序:
- 执行后生成
demo.pdf
文件 - 完整功能包括:页眉、标题、正文、表格和图片
- 执行后生成
常见问题解决
中文显示问题:
- 确保使用支持中文的字体
- 或添加额外中文字体依赖:
<dependency> <groupId>com.itextpdf</groupId> <artifactId>font-asian</artifactId> <version>7.2.5</version> </dependency>
图片路径错误:
- 使用绝对路径或确保相对路径正确
- 添加文件存在检查逻辑
页眉位置调整:
- 修改
setFixedPosition
的 Y 坐标值:
.setFixedPosition(0, pageSize.getTop() - 40, pageSize.getWidth()); // 调整-40值
- 修改
这个示例提供了完整的 PDF 导出功能,可根据实际需求调整样式和内容布局。