import Foundation import UIKit import Display public func generatePdfPreviewImage(url: URL, size: CGSize) -> UIImage? { guard let data = try? Data(contentsOf: url, options: .mappedIfSafe) else { return nil } return generatePdfPreviewImage(data: data, size: size) } public func generatePdfPreviewImage(data: Data, size: CGSize) -> UIImage? { guard let provider = CGDataProvider(data: data as CFData) else { return nil } guard let document = CGPDFDocument(provider) else { return nil } guard let firstPage = document.page(at: 1) else { return nil } guard let context = DrawingContext(size: size) else { return nil } context.withContext { c in var pageRect = firstPage.getBoxRect(.mediaBox) let pdfScale = 320.0 / pageRect.size.width pageRect.size = CGSize(width: pageRect.size.width * pdfScale, height: pageRect.size.height * pdfScale) pageRect.origin = CGPoint.zero c.setFillColor(UIColor.white.cgColor) c.fill(pageRect) c.translateBy(x: 0.0, y: pageRect.size.height) c.scaleBy(x: 1.0, y: -1.0) c.concatenate(firstPage.getDrawingTransform(.mediaBox, rect: pageRect, rotate: 0, preserveAspectRatio: true)) c.drawPDFPage(firstPage) } return context.generateImage() }