Swift中的PDF生成(iOS/macOS):完整指南
创建PDF文档是iOS和macOS应用程序中的常见任务之一:从生成报告和发票到导出数据和创建电子书。在Swift中,有几种内置和第三方工具可用于此目的。在本文中,我们将详细讨论在Apple平台上生成PDF的主要方法、它们的功能以及使用示例。
Apple内置框架
Apple生态系统提供了强大的工具,无需第三方依赖即可处理PDF。主要工具包括:
- UIGraphicsPDFRenderer(iOS 10+)——用于在UIKit中创建PDF的现代API。
- PDFKit——用于显示、编辑和创建PDF的框架(适用于iOS 11+和macOS 10.13+)。
- Core Graphics(Quartz 2D)——用于绘制和生成PDF的底层C语言API。
1. UIGraphicsPDFRenderer——简单快速的入门方式
这是iOS中最方便的方法。它允许您通过使用UIKit(UIView、UIImage、文本等)绘制来创建多页PDF。
import UIKit
func generatePDF() -> Data? { let pageSize = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4 let renderer = UIGraphicsPDFRenderer(bounds: pageSize)
let data = renderer.pdfData { context in context.beginPage()
// 绘制文本 let text = "你好,PDF世界!" let attributes: [NSAttributedString.Key: Any] = [ .font: UIFont.systemFont(ofSize: 24), .foregroundColor: UIColor.black ] text.draw(at: CGPoint(x: 50, y: 100), withAttributes: attributes)
// 绘制图像 if let image = UIImage(named: "logo") { image.draw(in: CGRect(x: 50, y: 200, width: 200, height: 100)) }
// 第二页 context.beginPage() let text2 = "这是第二页" text2.draw(at: CGPoint(x: 50, y: 50), withAttributes: attributes) }
return data}
// 保存到文件if let pdfData = generatePDF() { let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] let pdfURL = documentsPath.appendingPathComponent("document.pdf") try? pdfData.write(to: pdfURL) print("PDF已保存: \\(pdfURL)")}2. PDFKit——用于高级文档处理
PDFKit提供了PDFDocument和PDFPage类。它非常适合从带有格式的文本、表格和图像创建PDF。支持注释、书签和表单。
import PDFKit
func createPDFWithPDFKit() -> PDFDocument { let document = PDFDocument()
// 通过NSAttributedString创建页面 let pageRect = CGRect(x: 0, y: 0, width: 612, height: 792) // US Letter let text = NSAttributedString(string: "使用PDFKit的PDF示例第二行") let page = PDFPage()
// 渲染到页面上下文 let renderer = UIGraphicsImageRenderer(bounds: pageRect) let image = renderer.image { ctx in text.draw(at: CGPoint(x: 72, y: 72)) }
// 从图像创建页面(简化版) // 在实际项目中,请使用带有drawBlock的PDFPage let finalPage = PDFPage(image: image) ?? PDFPage() document.insert(finalPage, at: 0)
return document}
// 保存if let document = createPDFWithPDFKit() as? PDFDocument { let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("pdfkit_example.pdf") document.write(to: url)}重要提示:PDFKit仅适用于iOS 11+/macOS 10.13+。对于更旧的版本,请使用UIGraphicsPDFRenderer。
3. Core Graphics (Quartz 2D)——最大程度的控制
如果您的