根据UIImage.init(with: Data)的文档和data参数:
必须将data参数中的数据格式化为与系统支持的图像类型之一的文件格式匹配。
我假设在将PDF数据传递到此init时可以初始化UIImage
(因为iOS支持PDF矢量资产),但是不幸的是,我从此init获得了nil
。我是在做错什么,还是无法将PDF用作远程资产?
我本地没有此PDF数据,它是从后端获取的。
答案 0 :(得分:0)
我认为您需要为此使用UIGraphicsImageRenderer
或ImageContext
。对于前者(iOS> 10),您可以在此处尝试以下代码:
func drawPDFfromURL(url: URL) -> UIImage? {
guard let document = CGPDFDocument(url as CFURL) else { return nil }
// First page of the document.
guard let page = document.page(at: 1) else { return nil }
let pageRect = page.getBoxRect(.mediaBox)
let renderer = UIGraphicsImageRenderer(size: pageRect.size)
let img = renderer.image { ctx in
UIColor.white.set()
ctx.fill(pageRect)
ctx.cgContext.translateBy(x: 0.0, y: pageRect.size.height)
ctx.cgContext.scaleBy(x: 1.0, y: -1.0)
ctx.cgContext.drawPDFPage(page)
}
return img
}
希望有帮助。
答案 1 :(得分:0)
使用jake的响应,我找到了一种方法,只需将Data作为参数而不是像jake的回答那样传递url,就可以实现。
UIImage
的完整扩展名:
import UIKit
import PDFKit
import CoreGraphics
extension UIImage {
public static func fromPDF(data: Data) -> UIImage? {
guard
let pdf = PDFDocument(data: data),
let pdfPage = pdf.page(at: 0),
let pageRef = pdfPage.pageRef
else { return nil }
let pageRect = pageRef.getBoxRect(.mediaBox)
let renderer = UIGraphicsImageRenderer(size: pageRect.size)
let img = renderer.image { ctx in
UIColor.clear.set()
ctx.fill(pageRect)
ctx.cgContext.translateBy(x: 0.0, y: pageRect.size.height)
ctx.cgContext.scaleBy(x: 1.0, y: -1.0)
ctx.cgContext.drawPDFPage(pageRef)
}
return img
}
}