Quiero convertir una matriz UIImage en un archivo pdf. El tamaño de página del archivo PDF debe ser A4. Probé con PDFKIT pero el resultado no es el adecuado.
Lo que quiero:
Lo que probé:
func makePDF(images: [UIImage])-> PDFDocument? { let pdfDoc = PDFDocument() for (index,image) in images.enumerated() { let resizedImage = resizeImage(image: image, targetSize: PDFPageSize.A4) guard let cgImage = resizedImage?.cgImage else { return pdfDoc } let uiimage = UIImage(cgImage: cgImage, scale: image.scale, orientation: .up) if let pdfPage = PDFPage(image: uiimage) { let page = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4, 72 dpi pdfPage.setBounds(page, for: PDFDisplayBox.mediaBox) pdfDoc.insert(pdfPage, at: index) } } return pdfDoc } func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage? { let size = image.size let widthRatio = targetSize.width / size.width let heightRatio = targetSize.height / size.height var newSize: CGSize if(widthRatio > heightRatio) { newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio) } else { newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio) } let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height) UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0) image.draw(in: rect) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage }Mi salida es:
Mi salida de deseo es:
¿Cómo puedo hacer esto?
Primero tienes que entender por qué ves lo que ves, y esto explica que hasta cierto punto:
Dado que el origen del PDF está en la parte inferior izquierda, cuando agrega algo, se agregará al final de la página, por lo que sus imágenes están en la parte inferior.
Lo que probablemente deba hacer para solucionar esto es lo siguiente:
graphics context debe ser del tamaño de la página PDF, no de la imagen.Aquí están las modificaciones que haría a su función de cambio de tamaño:
func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage? { let size = image.size let widthRatio = targetSize.width / size.width let heightRatio = targetSize.height / size.height var newSize: CGSize if(widthRatio > heightRatio) { newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio) } else { newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio) } // Calculate the centerX and centerY let centerX = (targetSize.width - newSize.width) / 2.0 let centerY = (targetSize.height - newSize.height) / 2.0 // The rect of the image should be based on the center calculations let rect = CGRect(x: centerX, y: centerY, width: newSize.width, height: newSize.height) // The graphics context should be created with the page dimensions UIGraphicsBeginImageContextWithOptions(targetSize, false, 1.0) // The rest remains the same image.draw(in: rect) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage }Y creo que obtendrá el resultado deseado de las imágenes centradas en las páginas PDF:
Actualizar
Para alterar la calidad de la imagen generada, intente jugar con el parámetro de scale de la función UIGraphicsBeginImageContextWithOptions .
Puede pasar 2.0 para aumentar la escala a 2 veces o pasar 0 para usar la resolución del dispositivo.
UIGraphicsBeginImageContextWithOptions(targetSize, false, 0.0)