Génération de rapports PDF en Swift : PDFKit et UIPrintPageRenderer

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Génération de rapports PDF en Swift (iOS/macOS) avec PDFKit



La création de documents PDF est une tâche courante dans les applications mobiles et de bureau. Sur les plateformes Apple (iOS, macOS, watchOS, tvOS), le framework intégré PDFKit est utilisé à cet effet. Il permet de générer, afficher et modifier des fichiers PDF par programmation. Dans cet article, nous allons voir comment créer un rapport PDF complet en Swift : avec du texte, des tableaux, des images et des pages personnalisables.



Qu'est-ce que PDFKit ?

PDFKit est un framework d'Apple qui fait partie des SDK standard iOS/macOS. Il fournit des classes pour travailler avec les PDF :

  • PDFDocument — représentation de l'ensemble du document.
  • PDFPage — une page individuelle.
  • PDFView — affichage du PDF à l'écran.
  • UIPrintPageRenderer (pour iOS) — génération de pages via le dessin Core Graphics.

Pour la génération de rapports, on utilise le plus souvent UIPrintPageRenderer ou on dessine directement via Core Graphics dans le contexte PDF. La deuxième méthode offre plus de flexibilité, mais nécessite plus de code.



Préparation du projet

Ouvrez Xcode, créez un nouveau projet pour iOS ou macOS. Assurez-vous d'avoir importé le module PDFKit :

import PDFKitimport UIKit // pour iOS


Pour macOS, il faudra import Cocoa et le travail correspondant avec NSView.



Méthode 1 : Génération PDF via UIPrintPageRenderer (iOS)

Cette méthode est pratique si vous souhaitez utiliser du balisage HTML ou des mises en page complexes. UIPrintPageRenderer permet de restituer des pages via UIPrintFormatter.



func generatePDFUsingRenderer() -> Data? {    let renderer = UIPrintPageRenderer()        // Configuration de la taille de page A4    let pageSize = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // en points    renderer.setValue(pageSize, forKey: "paperRect")    renderer.setValue(pageSize, forKey: "printableRect")        // Création d'une chaîne HTML pour le rapport    let htmlString = """    <h1>Rapport de ventes</h1>    <p>Date : 2025-03-17</p>    <table border="1">        <tr><th>Produit</th><th>Quantité</th><th>Prix</th></tr>        <tr><td>Ordinateur portable</td><td>5</td><td>50000</td></tr>        <tr><td>Souris</td><td>20</td><td>1500</td></tr>    </table>    """        let formatter = UIMarkupTextPrintFormatter(markupText: htmlString)    renderer.addPrintFormatter(formatter, startingAtPageAt: 0)        // Rendu en PDF    let pdfData = NSMutableData()    UIGraphicsBeginPDFContextToData(pdfData, .zero, nil)        for pageIndex in 0..<renderer.numberOfPages {        UIGraphicsBeginPDFPage()        renderer.drawPage(at: pageIndex, in: UIGraphicsGetCurrentContext()!)    }        UIGraphicsEndPDFContext()    return pdfData as Data}


Appelez la fonction et enregistrez le résultat :

if let pdfData = generatePDFUsingRenderer() {    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)    let fileURL = paths[0].appendingPathComponent("report.pdf")    try? pdfData.write(to: fileURL)    print("PDF enregistré : \\(fileURL)")}


Méthode 2 : Dessin via Core Graphics (iOS/macOS)

Cette méthode est de plus bas niveau, mais offre un contrôle total sur chaque élément. Elle convient pour macOS, où UIPrintPageRenderer n'est pas disponible.



func generatePDFWithCoreGraphics() -> Data? {    let pdfData = NSMutableData()    let pageRect = CGRect(x: 0, y: 0, width: 612, height: 792) // US Letter        guard let consumer = CGDataConsumer(data: pdfData),          let pdfContext = CGContext(consumer: consu                    

Recommendations