Swift(iOS/macOS)中的PDF生成:完整指南
创建PDF文档是开发iOS和macOS应用程序时的关键任务之一。报告、账单、证书、电子书——所有这些都需要一个可靠且灵活的PDF生成工具。在Swift生态系统中,有多种方法:从Apple内置框架到具有高级功能的第三方库。在本文中,我们将分析生成PDF的主要方法、它们的优缺点,并提供可运行的代码示例。
1. PDFKit——Apple内置框架
PDFKit 是Apple提供的一个强大框架,适用于iOS 11+和macOS 10.13+。它提供了用于创建、显示和编辑PDF文档的高级API。主要功能包括:
- 从UIView、UIImage或文本创建PDF
- 添加注释、表单和超链接
- 处理多页文档
- 支持Core Graphics进行自定义绘制
从UIView创建PDF的示例:
import PDFKit
func generatePDF(from view: UIView) -> Data? { let pdfData = NSMutableData() UIGraphicsBeginPDFContextToData(pdfData, view.bounds, nil) UIGraphicsBeginPDFPage() guard let context = UIGraphicsGetCurrentContext() else { return nil } view.layer.render(in: context) UIGraphicsEndPDFContext() return pdfData as Data}如果您需要快速“截取”现有界面,这种方法很合适。但对于复杂的布局(表格、页眉页脚、自定义字体),最好直接使用Core Graphics。
2. Core Graphics(Quartz 2D)——底层解决方案
Core Graphics让您完全控制绘制过程。您处理PDF上下文,绘制线条、文本、图像,并管理页面。这是最灵活但也是最费力的方法。
创建包含文本的简单PDF的示例:
import UIKit
func createPDFWithText() -> Data? { let pageSize = CGRect(x: 0, y: 0, width: 612, height: 792) // A4 let data = NSMutableData() UIGraphicsBeginPDFContextToData(data, pageSize, nil) UIGraphicsBeginPDFPage() guard let context = UIGraphicsGetCurrentContext() else { return nil } let text = "你好,PDF世界!" let attributes: [NSAttributedString.Key: Any] = [ .font: UIFont.systemFont(ofSize: 24), .foregroundColor: UIColor.black ] text.draw(at: CGPoint(x: 50, y: 50), withAttributes: attributes) UIGraphicsEndPDFContext() return data as Data}对于复杂文档(表格、图像、页码),您需要编写大量辅助代码。但您将获得最佳性能和最小的文件大小。
3. TPPDF——开源第三方库
TPPDF(GitHub:techprimate/TPPDF)是一个使用声明式语法生成PDF的Swift库。它支持:
- 文本、图像、表格、列表
- 页眉页脚、页码
- 内容在页面间的自动换行
- 自定义字体、颜色、边框
通过Swift Package Manager安装:
// Package.swiftdependencies: [ .package(url: "https://github.com/techprimate/TPPDF.git", from: "2.0.0")]创建包含表格的文档示例:
import TPPDF
func generateInvoice() -> Data? { let document = PDFDocument(format: .a4) // 添加标题 document.add(text: "账单号123", style: PDFTextStyle.heading1) // 创建表格 let table = PDFTable(rows: 3, columns: 2) table[0][0].content = "商品" table[0][1].content = "价格" table[1][