Generación de informes PDF en Swift: PDFKit y UIPrintPageRenderer

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Generación de informes PDF en Swift (iOS/macOS) con PDFKit



La creación de documentos PDF es una de las tareas comunes en aplicaciones móviles y de escritorio. En las plataformas de Apple (iOS, macOS, watchOS, tvOS) se utiliza el framework integrado PDFKit. Permite generar, mostrar y editar archivos PDF mediante programación. En este artículo, veremos cómo crear un informe PDF completo con Swift: con texto, tablas, imágenes y páginas personalizables.



¿Qué es PDFKit?

PDFKit es un framework de Apple que forma parte de los SDK estándar de iOS/macOS. Proporciona clases para trabajar con PDF:

  • PDFDocument — representación de todo el documento.
  • PDFPage — una página individual.
  • PDFView — visualización de PDF en pantalla.
  • UIPrintPageRenderer (para iOS) — generación de páginas mediante dibujo con Core Graphics.

Para la generación de informes, se suele usar UIPrintPageRenderer o se dibuja directamente con Core Graphics en el contexto de PDF. El segundo método ofrece más flexibilidad, pero requiere más código.



Preparación del proyecto

Abra Xcode, cree un nuevo proyecto para iOS o macOS. Asegúrese de importar el módulo PDFKit:

import PDFKitimport UIKit // para iOS


Para macOS se necesita import Cocoa y el trabajo correspondiente con NSView.



Método 1: Generación de PDF mediante UIPrintPageRenderer (iOS)

Este método es útil si desea usar marcado HTML o diseños complejos. UIPrintPageRenderer permite renderizar páginas a través de UIPrintFormatter.



func generatePDFUsingRenderer() -> Data? {    let renderer = UIPrintPageRenderer()        // Configuración del tamaño de página A4    let pageSize = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // en puntos    renderer.setValue(pageSize, forKey: "paperRect")    renderer.setValue(pageSize, forKey: "printableRect")        // Crear una cadena HTML con el informe    let htmlString = """    <h1>Informe de ventas</h1>    <p>Fecha: 2025-03-17</p>    <table border="1">        <tr><th>Producto</th><th>Cantidad</th><th>Precio</th></tr>        <tr><td>Portátil</td><td>5</td><td>50000</td></tr>        <tr><td>Ratón</td><td>20</td><td>1500</td></tr>    </table>    """        let formatter = UIMarkupTextPrintFormatter(markupText: htmlString)    renderer.addPrintFormatter(formatter, startingAtPageAt: 0)        // Renderizado a 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}


Llame a la función y guarde el resultado:

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


Método 2: Dibujo con Core Graphics (iOS/macOS)

Este método es de más bajo nivel, pero brinda control total sobre cada elemento. Es adecuado para macOS, donde UIPrintPageRenderer no está 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