Kotlin 中的 PDF 生成:库概览与实践示例
Kotlin 作为 JVM 的现代语言,为开发者提供了处理 PDF 文档的强大工具。得益于与 Java 生态系统的完全兼容性,您可以使用久经考验的库,例如 iText 和 Apache PDFBox,以及现代的 Kotlin 框架。在本文中,我们将探讨在 Kotlin 中生成 PDF 的主要方法,提供代码示例,并比较流行的解决方案。
为什么选择 Kotlin 处理 PDF?
与 Java 相比,Kotlin 在处理 PDF 时提供了一系列优势:
- 简洁的语法 — 创建文档时样板代码更少
- 空安全 — 降低处理可空字段时出错的风险
- 扩展函数 — 允许扩展库的功能
- DSL 构建器 — 非常适合描述 PDF 结构
- 完全兼容 — 所有 Java 库无需修改即可运行
用于 PDF 生成的主要库
1. iText (iText 7 / iText 8)
iText — 最流行的商业 PDF 处理库。通过 Java 互操作可用于 Kotlin。包含模块:
kernel— PDF 基本操作layout— 文档的高级构建html2pdf— HTML 到 PDF 的转换pdfa— PDF/A 支持
使用 Kotlin 和 iText 7 创建简单 PDF 的示例:
import com.itextpdf.kernel.pdf.PdfDocumentimport com.itextpdf.kernel.pdf.PdfWriterimport com.itextpdf.layout.Documentimport com.itextpdf.layout.element.Paragraphimport java.io.FileOutputStream
fun createSimplePdf() { val writer = PdfWriter(FileOutputStream("hello_kotlin.pdf")) val pdfDoc = PdfDocument(writer) val document = Document(pdfDoc) document.add(Paragraph("你好,Kotlin!")) document.add(Paragraph("这是使用 iText 7 创建的 PDF")) document.close() println("PDF 创建成功")}2. Apache PDFBox
Apache PDFBox — 一个免费的开源库。非常适合基本任务:创建、编辑、提取文本。在 Kotlin 中通过 Java API 使用。
使用 PDFBox 的示例:
import org.apache.pdfbox.pdmodel.PDDocumentimport org.apache.pdfbox.pdmodel.PDPageimport org.apache.pdfbox.pdmodel.PDPageContentStreamimport org.apache.pdfbox.pdmodel.font.PDType1Fontimport java.io.File
fun createPdfWithBox() { val document = PDDocument() val page = PDPage() document.addPage(page) val contentStream = PDPageContentStream(document, page) contentStream.beginText() contentStream.setFont(PDType1Font.HELVETICA_BOLD, 14f) contentStream.newLineAtOffset(50f, 700f) contentStream.showText("PDFBox + Kotlin = ❤") contentStream.endText() contentStream.close() document.save(File("pdfbox_example.pdf")) document.close() println("文档已保存")}3. Kotlin DSL for PDF (KPDF)
KPDF — 一个原生的 Kotlin 库,使用 DSL 构建器。允许以声明式风格描述文档:
// 使用假设的 DSL 示例(适配实际库)fun generateInvoice() { pdfDocument { page { paragraph("发票号 #123") { fontSize = 24 bold() } table { row { cell("商品"); cell("价格") } row { cell("Kotlin 咨询"); cell("5000 卢布") } } } }.save("invoice.pdf")}