在 Kotlin 中生成 PDF 报告:库与示例

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

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

开始课程

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



Kotlin 作为 JVM 的现代语言,为开发者提供了创建 PDF 文档的强大工具。无论您是在创建财务报告、发票、分析仪表盘,还是仅仅导出数据,Kotlin 都有几个成熟的库可以解决这个问题。在本文中,我们将介绍用于在 Kotlin 中生成 PDF 的主要库,比较它们的功能,并提供实用的代码示例。



1. iText 7 — 强大且灵活的工具



iText 是 Java 和 Kotlin 世界中最流行的 PDF 处理库之一。它提供对文档内容的完全控制:文本、表格、图像、注释、书签等等。iText 7 是经过重新设计的版本,具有改进的架构。



安装 (Gradle)

implementation("com.itextpdf:itext7-core:8.0.2")


示例:创建简单的 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 java.io.FileOutputStream

fun generateReport(fileName: String, data: List<Pair<String, Int>>) { val writer = PdfWriter(FileOutputStream(fileName)) val pdf = PdfDocument(writer) val document = Document(pdf)

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

// 表格 val table = Table(2) table.addCell("商品") table.addCell("数量") data.forEach { (product, quantity) -> table.addCell(product) table.addCell(quantity.toString()) } document.add(table)

document.close() println("PDF 已创建: $fileName")}

// 使用fun main() { val salesData = listOf( "笔记本电脑" to 150, "显示器" to 230, "键盘" to 340 ) generateReport("report_itext.pdf", salesData)}


iText 提供了丰富的格式化 API:可以设置字体、颜色、边距、对齐方式,添加图像,甚至嵌入字体(例如,西里尔字体)。然而,iText 有许可限制:商业使用需要购买许可证(开源项目使用 AGPL)。



2. Apache PDFBox — 免费替代方案



Apache PDFBox 是一个开源库(Apache 2.0 许可证),对商业使用没有限制。PDFBox 允许从头创建 PDF、填写表单、提取文本,甚至处理数字签名。



安装 (Gradle)

implementation("org.apache.pdfbox:pdfbox:3.0.1")


示例:创建带表格的 PDF

import org.apache.pdfbox.pdmodel.PDDocumentimport org.apache.pdfbox.pdmodel.PDPageimport org.apache.pdfbox.pdmodel.PDPageContentStreamimport org.apache.pdfbox.pdmodel.font.PDType1Fontimport java.awt.Color

fun createPdfBoxReport(fileName: String, data: List<Pair<String, Int>>) { val document = PDDocument() val page = PDPage() document.addPage(page)

val contentStream = PDPageContentStream(document, page) contentStream.beginText() contentStream.setFont(PDType1Font.HELVETICA_BOLD, 18f) contentStream.newLineAtOffset(50f, 750f) contentStream.showText("销售报告 (PDFBox)") contentStream.endText()

// 手动绘制表格 var y = 700f contentStream.setFont(PDType1Font.HELVETICA, 12f) contentStream.setNonStrokingColor(Color.BLACK) data.forEach { (product, quantity) -> contentStream.beginText() contentStream.newLineAtOffset(50f, y) contentStream.showText("$product — $quantity 件") contentStream.endText()

推荐