Генерация PDF-отчётов на Swift: библиотеки и фреймворки для iOS/macOS

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Генерация 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                    

Рекомендаций