根据UIImage.init(with: Data)的文档和数据参数:
data 参数中的数据必须格式化为与系统支持的图像类型之一的文件格式相匹配。
我假设在将 PDF 数据传递给此 init 时可以初始化UIImage
(因为 iOS 支持 PDF 矢量资产),但不幸的是,我从这个 init 中得到了nil
。我做错了什么,或者无法将 PDF 用作远程资源?
我在本地没有这个 PDF 数据,它是从后端获取的。
使用 jake的响应,我找到了实现我需要的方法,只需将数据作为参数传递,而不是像 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
}
}
我认为您需要为此使用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
}
希望有帮助。