Generierung von PDF-Berichten in Swift: PDFKit und UIPrintPageRenderer

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Generierung von PDF-Berichten in Swift (iOS/macOS) mit PDFKit



Die Erstellung von PDF-Dokumenten ist eine häufige Aufgabe in mobilen und Desktop-Anwendungen. Auf Apple-Plattformen (iOS, macOS, watchOS, tvOS) wird dafür das integrierte Framework PDFKit verwendet. Es ermöglicht das programmatische Generieren, Anzeigen und Bearbeiten von PDF-Dateien. In diesem Artikel werden wir erläutern, wie Sie mit Swift einen vollständigen PDF-Bericht erstellen: mit Text, Tabellen, Bildern und anpassbaren Seiten.



Was ist PDFKit?

PDFKit ist ein Framework von Apple, das Teil der standardmäßigen iOS/macOS SDKs ist. Es bietet Klassen für die Arbeit mit PDF:

  • PDFDocument — Darstellung des gesamten Dokuments.
  • PDFPage — eine einzelne Seite.
  • PDFView — Anzeige von PDF auf dem Bildschirm.
  • UIPrintPageRenderer (für iOS) — Generierung von Seiten durch Core Graphics-Zeichnung.

Für die Generierung von Berichten wird meist UIPrintPageRenderer verwendet oder es wird direkt über Core Graphics im PDF-Kontext gezeichnet. Die zweite Methode bietet mehr Flexibilität, erfordert aber mehr Code.



Projektvorbereitung

Öffnen Sie Xcode, erstellen Sie ein neues Projekt für iOS oder macOS. Stellen Sie sicher, dass Sie das Modul PDFKit importiert haben:

import PDFKitimport UIKit // für iOS


Für macOS wird import Cocoa und die entsprechende Arbeit mit NSView benötigt.



Methode 1: PDF-Generierung über UIPrintPageRenderer (iOS)

Diese Methode ist praktisch, wenn Sie HTML-Auszeichnung oder komplexe Layouts verwenden möchten. UIPrintPageRenderer ermöglicht das Rendern von Seiten über UIPrintFormatter.



func generatePDFUsingRenderer() -> Data? {    let renderer = UIPrintPageRenderer()        // Konfiguration der Seitengröße A4    let pageSize = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // in Punkten    renderer.setValue(pageSize, forKey: "paperRect")    renderer.setValue(pageSize, forKey: "printableRect")        // Erstellen eines HTML-Strings mit dem Bericht    let htmlString = """    <h1>Verkaufsbericht</h1>    <p>Datum: 2025-03-17</p>    <table border="1">        <tr><th>Produkt</th><th>Menge</th><th>Preis</th></tr>        <tr><td>Laptop</td><td>5</td><td>50000</td></tr>        <tr><td>Maus</td><td>20</td><td>1500</td></tr>    </table>    """        let formatter = UIMarkupTextPrintFormatter(markupText: htmlString)    renderer.addPrintFormatter(formatter, startingAtPageAt: 0)        // Rendern in 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}


Rufen Sie die Funktion auf und speichern Sie das Ergebnis:

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 gespeichert: \\(fileURL)")}


Methode 2: Zeichnen über Core Graphics (iOS/macOS)

Diese Methode ist niedriger, bietet aber die vollständige Kontrolle über jedes Element. Geeignet für macOS, wo UIPrintPageRenderer nicht verfügbar ist.



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                    

Empfehlungen