Kotlin 中的 PDF 生成:库与工具(iText, Apache PDFBox)

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

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

开始课程

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")}

推荐