Генерация PDF-отчётов на Swift (iOS/macOS)
Создание PDF-документов на платформах Apple — одна из ключевых задач при разработке бизнес-приложений, финансовых отчётов или систем документооборота. В отличие от веб-стека, где используется множество сторонних библиотек, в экосистеме Swift для работы с PDF есть как мощные встроенные фреймворки, так и специализированные сторонние решения. В этой статье мы подробно разберём все основные инструменты для генерации PDF-отчётов на Swift для iOS и macOS.
Встроенные фреймворки Apple
Apple предоставляет два основных способа создания PDF-документов: UIGraphicsPDFRenderer (для UIKit) и PDFKit (для работы с существующими PDF). Также в macOS доступен NSGraphicsContext с поддержкой PDF.
UIGraphicsPDFRenderer (iOS 10+)
Это основной инструмент для генерации PDF из UIKit-контента. Он позволяет рисовать текст, изображения, таблицы и произвольную графику в контексте PDF-страницы.
import UIKit
func generateReport(data: String) -> Data {
let pageSize = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4
let renderer = UIGraphicsPDFRenderer(bounds: pageSize)
return renderer.pdfData { context in
context.beginPage()
// Заголовок
let title = "Отчёт о продажах"
let attributes: [NSAttributedString.Key: Any] = [
.font: UIFont.boldSystemFont(ofSize: 24),
.foregroundColor: UIColor.darkGray
]
title.draw(at: CGPoint(x: 50, y: 50), withAttributes: attributes)
// Содержимое
let textAttributes: [NSAttributedString.Key: Any] = [
.font: UIFont.systemFont(ofSize: 14)
]
data.draw(at: CGPoint(x: 50, y: 100), withAttributes: textAttributes)
// Линия-разделитель
context.cgContext.setStrokeColor(UIColor.lightGray.cgColor)
context.cgContext.setLineWidth(1)
context.cgContext.move(to: CGPoint(x: 50, y: 90))
context.cgContext.addLine(to: CGPoint(x: 545, y: 90))
context.cgContext.strokePath()
}
}
PDFKit (iOS 11+, macOS 10.13+)
PDFKit — более высокоуровневый фреймворк, который позволяет не только создавать, но и редактировать существующие PDF. Он поддерживает аннотации, формы, закладки и работу с многостраничными документами.
import PDFKit
func createPDFWithText() -> PDFDocument {
let page = PDFPage()
let pdfDocument = PDFDocument()
// Создаём страницу с текстом
let text = "PDFKit позволяет легко добавлять текст и аннотации"
let textAnnotation = PDFAnnotation(
bounds: CGRect(x: 50, y: 700, width: 500, height: 100),
forType: .freeText,
withProperties: nil
)
textAnnotation.contents = text
textAnnotation.font = UIFont.systemFont(ofSize: 18)
page.addAnnotation(textAnnotation)
pdfDocument.insert(page, at: 0)
return pdfDocument
}
Сторонние библиотеки для Swift
Хотя встроенные средства покрывают большинство задач, существуют ситуации, когда нужна специализированная функциональность: работа с шаблонами, экспорт в PDF из SwiftUI или поддержка сложной вёрстки.
SwiftUI и PDF (iOS 14+, macOS 11+)
Начиная с iOS 14, можно конвертировать SwiftUI-вью в PDF с помощью ImageRenderer:
import SwiftUI
struct ReportView: View {
var body: some View {
VStack(alignment: .leading) {
Text("Ежемесячный отчёт")
.font(.largeTitle)
.foregroundColor(.blue)
Text("Данные за август 2024")
.font(.headline)
Divider()
Text("Выручка: 1 234 567 ₽")
.font(.body)
}
.padding()
}
}
func generatePDFFromSwiftUI() -> Data {
let view = ReportView()
let renderer = ImageRenderer(content: view)
// Настройка размера страницы
renderer.scale = 2.0
renderer.proposedSize = .init(width: 595, height: 842)
guard let data = renderer.pdfData else {
fatalError("Не удалось создать PDF")
}
return data
}
TPPDF — библиотека для создания PDF
TPPDF — популярная open-source библиотека, предоставляющая fluent-интерфейс для построения PDF-документов. Поддерживает таблицы, изображения, нумерацию страниц и многое другое.
import TPPDF
func generateWithTPPDF() throws -> Data {
let document = PDFDocument(format: .a4)
// Добавляем текст
let title = PDFSimpleText(text: "TPPDF Example