Можно ли инициализировать UIImage с удаленными данными PDF? - PullRequest
0 голосов
/ 16 июня 2019

Согласно документам UIImage.init (с: Data) и параметру данных:

Данные в параметре data должны быть отформатированы в соответствии с форматом файла одного из поддерживаемых системой типов изображений.

Я предполагал, что можно будет инициализировать UIImage при передаче данных PDF в этот init (поскольку iOS поддерживает векторные активы PDF), но, к сожалению, я получаю nil от этого init. Я делаю что-то неправильно или невозможно использовать PDF-файлы в качестве удаленных ресурсов?

У меня нет этих данных PDF локально, они извлекаются из бэкэнда.

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Используя ответ Джейка, я нашел способ добиться того, что мне нужно, просто передав Данные в качестве параметра, а не 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
    }
}
0 голосов
/ 16 июня 2019

Я думаю, вам нужно использовать 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
}

Надеюсь, это поможет.

...