是否可以用PDF远程数据初始化UIImage?

时间:2019-06-16 10:01:26

标签: ios swift uiimageview uiimage uikit

根据UIImage.init(with: Data)的文档和data参数:

  

必须将data参数中的数据格式化为与系统支持的图像类型之一的文件格式匹配。

我假设在将PDF数据传递到此init时可以初始化UIImage(因为iOS支持PDF矢量资产),但是不幸的是,我从此init获得了nil。我是在做错什么,还是无法将PDF用作远程资产?

我本地没有此PDF数据,它是从后端获取的。

2 个答案:

答案 0 :(得分:0)

我认为您需要为此使用UIGraphicsImageRendererImageContext。对于前者(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
    }
}