Java 生成 PDF 报告:库概述与代码示例
创建 PDF 文档是企业级 Java 应用程序中的常见任务之一:从生成发票和证书到构建带有图表的复杂分析报告。在本文中,我们将介绍三种主要的 Java PDF 生成库——iText、Apache PDFBox 和 JasperReports——比较它们的功能,并提供可运行的代码示例。
1. iText——强大且灵活的库
iText(目前为 iText 8.x)是 Java 中最流行的 PDF 处理库之一。支持从头创建文档、编辑现有文档、添加图像、表格、书签、水印,以及处理表单和数字签名。
许可: iText 采用双重许可——AGPL(对开源项目免费)和商业许可(用于专有软件)。
示例:创建包含文本和表格的简单 PDF 文档
import com.itextpdf.kernel.pdf.PdfDocument;import com.itextpdf.kernel.pdf.PdfWriter;import com.itextpdf.layout.Document;import com.itextpdf.layout.element.Paragraph;import com.itextpdf.layout.element.Table;import com.itextpdf.layout.element.Cell;
public class ItextPdfExample { public static void main(String[] args) throws Exception { String dest = "report.pdf"; PdfWriter writer = new PdfWriter(dest); PdfDocument pdf = new PdfDocument(writer); Document document = new Document(pdf);
// 标题 document.add(new Paragraph("销售报告").setBold().setFontSize(18));
// 表格 Table table = new Table(3); table.addCell(new Cell().add(new Paragraph("商品"))); table.addCell(new Cell().add(new Paragraph("数量"))); table.addCell(new Cell().add(new Paragraph("金额"))); table.addCell("笔记本电脑"); table.addCell("5"); table.addCell("450 000 ₽"); table.addCell("鼠标"); table.addCell("12"); table.addCell("6 000 ₽");
document.add(table); document.close(); System.out.println("PDF 已创建!"); }}此代码创建了一个带有标题“销售报告”和三列表格的 PDF。iText 自动处理换行和分页。
2. Apache PDFBox——轻量级且免费的替代方案
Apache PDFBox 是一个开源库(Apache 2.0 许可),允许创建、编辑和从 PDF 文件中提取文本。PDFBox 不需要第三方依赖,非常适合简单任务:生成文本文档、填写表单、提取数据。
缺点: 与 iText 相比,处理表格和复杂布局需要更多手动编码。
示例:创建包含文本和图像的 PDF
import org.apache.pdfbox.pdmodel.PDDocument;import org.apache.pdfbox.pdmodel.PDPage;import org.apache.pdfbox.pdmodel.PDPageContentStream;import org.apache.pdfbox.pdmodel.font.PDType0Font;import java.io.File;
public class PdfBoxExample { public static void main(String[] args) throws Exception { try (PDDocument document = new PDDocument()) { PDPage page = new PDPage(); document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(document, page); // 加载字体(必须!) PDType0Font font = PDType0Font.load(document, new File("LiberationSans-Regular.ttf")); contentStream.setFont(font, 14); contentStream.beginText(); contentStream.newLineAtOffset(50, 700); contentStream.showText("你好,PDFBox 世界!"); contentStream.endText(); contentStream.close();