Génération de rapports PDF en Swift (iOS/macOS)
La création de documents PDF sur les plateformes Apple est l'une des tâches clés lors du développement d'applications professionnelles, de rapports financiers ou de systèmes de gestion documentaire. Contrairement à la pile web, où de nombreuses bibliothèques tierces sont utilisées, dans l'écosystème Swift, il existe à la fois des frameworks intégrés puissants et des solutions tierces spécialisées pour travailler avec les PDF. Dans cet article, nous allons détailler tous les outils principaux pour la génération de rapports PDF en Swift pour iOS et macOS.
Frameworks intégrés Apple
Apple propose deux méthodes principales pour créer des documents PDF : UIGraphicsPDFRenderer (pour UIKit) et PDFKit (pour travailler avec des PDF existants). macOS propose également NSGraphicsContext avec le support PDF.
UIGraphicsPDFRenderer (iOS 10+)
C'est l'outil principal pour générer des PDF à partir de contenu UIKit. Il permet de dessiner du texte, des images, des tableaux et des graphiques arbitraires dans le contexte d'une page 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() // Titre let title = "Rapport de ventes" let attributes: [NSAttributedString.Key: Any] = [ .font: UIFont.boldSystemFont(ofSize: 24), .foregroundColor: UIColor.darkGray ] title.draw(at: CGPoint(x: 50, y: 50), withAttributes: attributes) // Contenu let textAttributes: [NSAttributedString.Key: Any] = [ .font: UIFont.systemFont(ofSize: 14) ] data.draw(at: CGPoint(x: 50, y: 100), withAttributes: textAttributes) // Ligne de séparation 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 est un framework de plus haut niveau qui permet non seulement de créer, mais aussi de modifier des PDF existants. Il prend en charge les annotations, les formulaires, les signets et le travail avec des documents multipages.
import PDFKit
func createPDFWithText() -> PDFDocument { let page = PDFPage() let pdfDocument = PDFDocument() // Création d'une page avec du texte let text = "PDFKit permet d'ajouter facilement du texte et des annotations" 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}Bibliothèques tierces pour Swift
Bien que les outils intégrés couvrent la plupart des tâches, il existe des situations où une fonctionnalité spécialisée est nécessaire : travail avec des modèles, exportation en PDF depuis SwiftUI ou prise en charge d'une mise en page complexe.
SwiftUI et PDF (iOS 14+, macOS 11+)
À partir d'iOS 14, il est possible de convertir une vue SwiftUI en PDF à l'aide de ImageRenderer :
import SwiftUI
struct ReportView: View { var body: some View { VStack(alignment: .leading) { Text("Rapport mensuel") .font(.largeTitle) .foregroundColor(.blue) Text("Données pour août 2024") .font(.headline) Divider() Text("Chiffre d'affaires : 1 234 567 ₽") .font(.body) } .padding() }}
func generatePDFFromSwiftUI() -> Data { let vie