Swift(iOS/macOS)中的PDF生成:工具概览与示例

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

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

开始课程

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][

推荐