Génération de rapports PDF en Swift pour iOS et macOS
La création de documents PDF est une tâche courante dans les applications mobiles et de bureau. Sur les plateformes Apple (iOS, macOS), des outils intégrés puissants sont disponibles : PDFKit et Core Graphics. Dans cet article, nous verrons comment générer un rapport multipage avec des tableaux, du texte et des graphiques, en utilisant uniquement du Swift natif.
Pourquoi utiliser les outils intégrés ?
- Aucune dépendance externe — tout est déjà inclus dans le SDK.
- Contrôle total du rendu — travail avec les coordonnées, les polices, les couleurs.
- Multiplateforme — le code fonctionne à la fois sur iOS et macOS.
- Haute performance — Core Graphics utilise l'accélération matérielle.
Approches principales
Il existe deux méthodes principales pour générer des PDF en Swift :
- PDFKit — API de haut niveau pour travailler avec les PDF (lecture, édition, création).
- Core Graphics — rendu de bas niveau via le contexte PDF.
Nous aborderons la deuxième approche, car elle offre une flexibilité maximale pour créer des rapports « à partir de zéro ».
Création du contexte PDF
La première étape consiste à créer un contexte PDF dans lequel nous allons dessiner les éléments. Pour cela, on utilise la fonction UIGraphicsBeginPDFContextToFile (iOS) ou son équivalent pour macOS.
import UIKit
func generatePDF() -> URL? { let fileName = "Report.pdf" let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) guard let documentsURL = paths.first else { return nil } let pdfURL = documentsURL.appendingPathComponent(fileName) let pageSize = CGRect(x: 0, y: 0, width: 612, height: 792) // A4 UIGraphicsBeginPDFContextToFile(pdfURL.path, pageSize, nil) // Ici, nous allons dessiner les pages UIGraphicsEndPDFContext() return pdfURL}Ajout de pages et de contenu
Chaque page commence par un appel à UIGraphicsBeginPDFPage(). Ensuite, vous pouvez utiliser les méthodes standard d'UIKit pour dessiner.
func drawReport() { guard let pdfURL = generatePDF() else { return } UIGraphicsBeginPDFContextToFile(pdfURL.path, CGRect(x: 0, y: 0, width: 612, height: 792), nil) // Première page UIGraphicsBeginPDFPage() drawHeader(title: "Rapport mensuel") drawTable(data: sampleData) // Deuxième page (si nécessaire) UIGraphicsBeginPDFPage() drawChart() UIGraphicsEndPDFContext()}Dessiner du texte et des titres
Pour dessiner du texte, nous utilisons NSString avec des attributs.
func drawHeader(title: String) { let titleAttributes: [NSAttributedString.Key: Any] = [ .font: UIFont.boldSystemFont(ofSize: 24), .foregroundColor: UIColor.darkGray ] title.draw(at: CGPoint(x: 50, y: 40), withAttributes: titleAttributes)}Création d'un tableau simple
Un tableau peut être dessiné à l'aide de lignes et de texte. Voici un exemple de génération d'un tableau à deux colonnes.
func drawTable(data: [(String, String)]) { let startX: CGFloat = 50 var startY: CGFloat = 100 let colWidth: CGFloat = 250 let rowHeight: CGFloat = 30 // Dessiner les en-têtes let headerAttributes: [NSAttributedString.Key: Any] = [ .font: UIFont.boldSystemFont(ofSize: 14), .foregroundColor: UIColor.black ] "Nom".draw(at: CGPoint(x: startX, y: startY), withAttributes: headerAttributes) "Valeur".draw(at: CGPoint(x: startX + colWidth, y: startY), withAttributes: headerAttributes) startY += rowHeight // Dessiner les lignes for (key, value) in data { let rowAtt Aussi dans la bibliothèque
Pimple PHP : guide complet avec exemples pratiques
Envoi d'email en Rust : bibliothèques lettre et async-smtp pour les mailings