Java 导出pdf 写出demo 1、需要设置自定义页眉和文字 2、可以插入表格 3、可以插入图片
以下是一个使用 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 {@Overridepublic 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 导出功能,可根据实际需求调整样式和内容布局。