在 Kotlin 中生成 PDF 报告:iText、Apache PDFBox、OpenPDF

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Kotlin 中生成 PDF 报告:库概述与实践示例



Kotlin 作为一种现代的 JVM 语言,非常适合创建服务器端应用程序,包括生成复杂的 PDF 报告。与 Python 中流行的 ReportLab 或 FPDF 不同,在 Kotlin/Java 生态系统中,使用的是久经考验的库:iText、Apache PDFBox 和 OpenPDF。在本文中,我们将逐一介绍它们,展示 Kotlin 代码示例,并给出选择建议。



1. iText(版本 7 和 8)

iText 是 JVM 上生成 PDF 的事实标准。该库提供了强大的 API,用于从头创建文档、处理表单、水印和数字签名。然而,从版本 7 开始,iText 已转向 AGPL(或商业)许可证,这在商业使用时需要特别注意。



在 Kotlin 中创建带表格的简单 PDF 示例:

import com.itextpdf.kernel.pdf.PdfDocumentimport com.itextpdf.kernel.pdf.PdfWriterimport com.itextpdf.layout.Documentimport com.itextpdf.layout.element.Paragraphimport com.itextpdf.layout.element.Tableimport com.itextpdf.layout.property.UnitValue

fun generateReportItext(outputPath: String) { val writer = PdfWriter(outputPath) val pdf = PdfDocument(writer) val document = Document(pdf)

// 标题 document.add(Paragraph("销售报告").setFontSize(20))

// 表格 val table = Table(UnitValue.createPercentArray(3)).useAllAvailableWidth() table.addCell("商品") table.addCell("数量") table.addCell("价格") table.addCell("笔记本电脑") table.addCell("10") table.addCell("75000") table.addCell("显示器") table.addCell("5") table.addCell("25000")

document.add(table) document.close() println("PDF 已创建:$outputPath")}


2. Apache PDFBox

PDFBox 是一个免费库(Apache 2.0 许可证),不仅可以创建 PDF,还可以提取文本、填写表单、将页面渲染为图像。其 API 比 iText 更底层,但提供了对内容的完全控制。



带图像和文本格式化的示例:

import org.apache.pdfbox.pdmodel.PDDocumentimport org.apache.pdfbox.pdmodel.PDPageimport org.apache.pdfbox.pdmodel.PDPageContentStreamimport org.apache.pdfbox.pdmodel.font.PDType0Fontimport org.apache.pdfbox.pdmodel.graphics.image.PDImageXObjectimport java.io.File

fun generateReportPdfBox(outputPath: String) { val document = PDDocument() val page = PDPage() document.addPage(page)

val contentStream = PDPageContentStream(document, page) // 加载字体 (TrueType) val font = PDType0Font.load(document, File("fonts/DejaVuSans.ttf")) contentStream.setFont(font, 14f)

// 文本 contentStream.beginText() contentStream.newLineAtOffset(50f, 750f) contentStream.showText("2025年1月报告") contentStream.endText()

// 图像 (Logo) val image = PDImageXObject.createFromFile("logo.png", document) contentStream.drawImage(image, 50f, 650f, 100f, 50f)

contentStream.close() document.save(outputPath) document.close() println("PDFBox 报告已就绪:$outputPath")}


3. OpenPDF

OpenPDF 是旧版 iText(LGPL)的一个分支,完全免费。非常适合简单的报告:文本、表格、基本图形基元。其 API 类似于 iText 2.x,但在现代 Kotlin 代码中这不是问题。



创建带段落和列表的 PDF 示例:

import com.lowagie.text.Documentimport com.lowagie.text.Paragraphimport com.lowagie.text.pdf.PdfWriterimport java.io.FileOutputStream

fun generateReportOpenPdf(outputPath: String) {

推荐