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 iOSPara 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 También en la biblioteca
Planificador de tareas en Node.js: node-cron, node-schedule y Bull
Tokens JWT en PHP: Guía completa de autenticación y autorización
Trabajo con fechas en PHP: biblioteca Carbon
Sharp para JavaScript (Node.js): guía completa con ejemplos
Bibliotecas WebSocket para Node.js: ws, Socket.IO, uWS — revisión completa