是否可以使用 PDF 远程数据初始化 UIImage?
Is it possible to initialise UIImage with PDF remote data?
根据UIImage.init(with: Data)的文档和数据参数:
The data in the data parameter must be formatted to match the file format of one of the system’s supported image types.
我假设在将 PDF 数据传递给此 init 时可以初始化 UIImage
(因为 iOS 支持 PDF 矢量资产)但不幸的是我从 nil
这个初始化。我是不是做错了什么或者无法将 PDF 用作远程资产?
我本地没有这个PDF数据,是从后台获取的
我认为您需要为此使用 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
}
希望对您有所帮助。
使用 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
}
}
根据UIImage.init(with: Data)的文档和数据参数:
The data in the data parameter must be formatted to match the file format of one of the system’s supported image types.
我假设在将 PDF 数据传递给此 init 时可以初始化 UIImage
(因为 iOS 支持 PDF 矢量资产)但不幸的是我从 nil
这个初始化。我是不是做错了什么或者无法将 PDF 用作远程资产?
我本地没有这个PDF数据,是从后台获取的
我认为您需要为此使用 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
}
希望对您有所帮助。
使用 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
}
}