Geração de PDF em Swift (iOS/macOS): guia completo
Criar documentos PDF é uma tarefa comum em aplicativos iOS e macOS: desde a geração de relatórios e faturas até a exportação de dados e criação de livros eletrônicos. Em Swift, existem várias ferramentas nativas e de terceiros para isso. Neste artigo, vamos detalhar as principais abordagens para geração de PDF nas plataformas Apple, suas capacidades e exemplos de uso.
Frameworks nativos da Apple
O ecossistema Apple oferece ferramentas poderosas para trabalhar com PDF sem dependências externas. As principais são:
- UIGraphicsPDFRenderer (iOS 10+) — API moderna para criar PDF no UIKit.
- PDFKit — framework para exibir, editar e criar PDF (disponível no iOS 11+ e macOS 10.13+).
- Core Graphics (Quartz 2D) — API de baixo nível baseada em C para desenho e geração de PDF.
1. UIGraphicsPDFRenderer — simples e rápido para começar
Esta é a maneira mais conveniente para iOS. Permite criar PDFs com várias páginas, desenhando usando UIKit (UIView, UIImage, texto, etc.).
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()
// Desenha texto let text = "Olá, mundo PDF!" let attributes: [NSAttributedString.Key: Any] = [ .font: UIFont.systemFont(ofSize: 24), .foregroundColor: UIColor.black ] text.draw(at: CGPoint(x: 50, y: 100), withAttributes: attributes)
// Desenha imagem if let image = UIImage(named: "logo") { image.draw(in: CGRect(x: 50, y: 200, width: 200, height: 100)) }
// Segunda página context.beginPage() let text2 = "Esta é a segunda página" text2.draw(at: CGPoint(x: 50, y: 50), withAttributes: attributes) }
return data}
// Salvar em arquivoif 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 salvo: \\(pdfURL)")}2. PDFKit — para trabalho avançado com documentos
O PDFKit fornece as classes PDFDocument e PDFPage. É ideal para criar PDFs a partir de texto formatado, tabelas e imagens. Suporta anotações, marcadores e formulários.
import PDFKit
func createPDFWithPDFKit() -> PDFDocument { let document = PDFDocument()
// Cria página via NSAttributedString let pageRect = CGRect(x: 0, y: 0, width: 612, height: 792) // US Letter let text = NSAttributedString(string: "Exemplo de PDF com PDFKitSegunda linha") let page = PDFPage()
// Renderização no contexto da página let renderer = UIGraphicsImageRenderer(bounds: pageRect) let image = renderer.image { ctx in text.draw(at: CGPoint(x: 72, y: 72)) }
// Cria página a partir da imagem (simplificado) // Em um projeto real, use PDFPage com drawBlock let finalPage = PDFPage(image: image) ?? PDFPage() document.insert(finalPage, at: 0)
return document}
// Salvarif let document = createPDFWithPDFKit() as? PDFDocument { let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("pdfkit_example.pdf") document.write(to: url)}Importante: O PDFKit está disponível apenas no iOS 11+/macOS 10.13+. Para versões mais antigas, use UIGraphicsPDFRenderer.
3. Core Graphics (Quartz 2D) — controle máximo
Se vo