Как отобразить PDF, загруженный из Интернета в PDFKit? - PullRequest
0 голосов
/ 23 октября 2019

Я успешно загрузил PDF-файл из Интернета, и он сохранен в каталоге документов. URL-адрес загруженного файла следующий:

file:///Users/heetshah/Library/Developer/CoreSimulator/Devices/4BF83AAF-A910-46EB-AE76-91BC6BEED033/data/Containers/Data/Application/B4532805-2842-431F-B16C-C5E448C8366F/Documents/TPAFForm.pdf

Я пытаюсь отобразить его в PDFKit следующим образом.

let path = URL(fileURLWithPath: pdfUrl!)
if let document = PDFDocument(url: path) {
  pdfView.document = document
  pdfView.displayMode = .singlePageContinuous
  pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  pdfView.displaysAsBook = true
  pdfView.displayDirection = .vertical
  pdfView.autoScales = true
  pdfView.maxScaleFactor = 4.0
  pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
}

Я не получаю никакой ошибки

Я просмотрел кучу сообщений о переполнении стека, и он показывает то же решение, что и выше, но в моем случае это не работает. Я также попробовал следующее решение, но оно не работает

if let path = Bundle.main.path(forResource: pdfUrl, ofType: "pdf") {
            let url = URL(fileURLWithPath: path)
            if let pdfDocument = PDFDocument(url: url) {..

Ниже приведен мой код для загрузки файла

func downloadPDF(pdfUrl: String?,fileName: String,completionHandler:@escaping(String,Bool) -> ()){
        let destinationPath: DownloadRequest.DownloadFileDestination = {
            _,_ in
            let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
            let fileURL = documentsURL.appendingPathComponent("\(fileName).pdf")
            return (fileURL,[.removePreviousFile,.createIntermediateDirectories])
        }

        if let pdfUrl = pdfUrl {
            Alamofire.download(pdfUrl, to: destinationPath).downloadProgress { (progress) in

            }.responseData { (response) in
                switch response.result{
                case .success:
                    if response.destinationURL != nil,let filePath = response.destinationURL?.absoluteString{
                        completionHandler(filePath,true)
                    }
                    break
                case .failure:
                    completionHandler("Something went wrong",false)
                    break
                }
            }
        }
    }

Я использую Alamofire для загрузки файла. Существуют ограничения для моего PDFView, так как я могу отображать PDF-файл с URL-адресом в своем предварительном просмотре, но мне нужно сначала загрузить PDF-файл локально, а затем отобразить его в моем PDF-представлении

1 Ответ

2 голосов
/ 23 октября 2019

Поскольку вы не показали достаточного кода для отладки проблемы, вот полный код для выполнения того, что вы описываете, и вы можете отладить вашу проблему, сравнив ваш код с моим:

import UIKit
import PDFKit

class ViewController: UIViewController {

    let pdfurl = URL(string:"https://www.apeth.com/rez/release.pdf")!
    let pdffileurl : URL = {
        let fm = FileManager.default
        let docsurl = try! fm.url(
            for: .documentDirectory, in: .userDomainMask, 
            appropriateFor: nil, create: true)
        return docsurl.appendingPathComponent("mypdf.pdf")
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        let sess = URLSession.shared
        sess.downloadTask(with: self.pdfurl) { (url, resp, err) in
            if let url = url {
                let fm = FileManager.default
                try? fm.removeItem(at: self.pdffileurl)
                try? fm.moveItem(at: url, to: self.pdffileurl)
                DispatchQueue.main.async {
                    self.displayPDF()
                }
            }
        }.resume()
    }

    func displayPDF() {
        let pdfview = PDFView(frame:self.view.bounds)
        pdfview.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        pdfview.autoScales = true
        self.view.addSubview(pdfview)
        let doc = PDFDocument(url: self.pdffileurl)
        pdfview.document = doc
    }

}
...