Преобразование PDF в изображение - Swift iOS - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь преобразовать файл PDF и все его страницы в изображения png.

Я собрал код ниже, заполнив пример в этой теме Как эффективно конвертировать PDF в PNG?

Когда я запускаю код, он падает на исходный файл PDF (sourceURL), там определенно есть файл.и когда я печатаю sourceURl, он печатает URL-адрес файла.

Авария говорит, что она обнаружена nil - Насколько я понимаю, это означает, что не удалось найти файл?хотя я могу физически увидеть и открыть файл, а также распечатать URL файл.

Может кто-нибудь указать, что я делаю неправильно?

Код:

func convertPDFtoPNG() {
    let sourceURL = pptURL
    print("pptURL:", pptURL!)
    let destinationURL = pngURL
    let urls = try? convertPDF(at: sourceURL!, to: destinationURL!, fileType: .png, dpi: 200)
}
func convertPDF(at sourceURL: URL, to destinationURL: URL, fileType: ImageFileType, dpi: CGFloat = 200) throws -> [URL] {
    let pdfDocument: CGPDFDocument! = CGPDFDocument(sourceURL as CFURL)!  //Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let bitmapInfo = CGImageAlphaInfo.noneSkipLast.rawValue

    var urls = [URL](repeating: URL(fileURLWithPath : "/"), count: pdfDocument.numberOfPages)
    DispatchQueue.concurrentPerform(iterations: pdfDocument.numberOfPages) { i in

        let pdfPage = pdfDocument.page(at: i + 1)!

        let mediaBoxRect = pdfPage.getBoxRect(.mediaBox)
        let scale = dpi / 72.0
        let width = Int(mediaBoxRect.width * scale)
        let height = Int(mediaBoxRect.height * scale)

        let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: bitmapInfo)!
        context.interpolationQuality = .high
        context.fill(CGRect(x: 0, y: 0, width: width, height: height))
        context.scaleBy(x: scale, y: scale)
        context.drawPDFPage(pdfPage)

        let image = context.makeImage()!
        let imageName = sourceURL.deletingPathExtension().lastPathComponent
        let imageURL = destinationURL.appendingPathComponent("\(imageName)-Page\(i+1).\(fileType.fileExtention)")

        let imageDestination = CGImageDestinationCreateWithURL(imageURL as CFURL, fileType.uti, 1, nil)!
        CGImageDestinationAddImage(imageDestination, image, nil)
        CGImageDestinationFinalize(imageDestination)

        urls[i] = imageURL
    }
    return urls
}

1 Ответ

0 голосов
/ 31 января 2019

Убедитесь, что ваш pptURL - это URL файла.
URL(string: "path/to/pdf") и URL(fileURLWithPath: "path/to/pdf") - это разные вещи, и вы должны использовать последний при инициализации вашего URL.

Вывод должен начинаться с префикса "file: ///", например

file: /// Users / dev / Library / Developer / CoreSimulator / Devices / 4FF18699-D82F-4308-88D6-44E3C11C955A / data / Containers / Bundle / Application / 8F230041-AC15-45D9-863F-5778B565B12F / myApp.app / example.pdf

...