首页 > 解决方案 > 使用 PDFKit Swift (ios)/Capacitor 加载 PDF 而不下载文件

问题描述

我有一个电容器离子项目,我正在创建一个自定义电容器插件来预览 PDF。Base64 正在正确记录(尝试在浏览器中使用 base64 打开并且 pdf 可以正常打开)但 PDF 无法在模拟器中预览。任何帮助将不胜感激。

链接到我的文件:https ://github.com/Richa-Singh-1/capacitor-pdf-viewer/blob/main/ios/Plugin/PdfViewer.swift

PS:我对 Swift 很天真。

import Foundation
import PDFKit
@objc public class PdfViewer: UIViewController, PDFViewDelegate {
    var pdfView: PDFView = PDFView()
    public override func viewDidLoad() {
        super.viewDidLoad()
        pdfView = PDFView()
        self.view.addSubview(pdfView)
    }

    @objc public func loadPDF(url: String) -> Void {
        guard let pdfURL = URL(string: url) else {
            print("Error: cannot create URL")
            return
        }
        var pdfURLRequest = URLRequest(url: pdfURL)
        pdfURLRequest.httpMethod = "GET"
        let session = URLSession.shared
        let task = session.dataTask(with: pdfURLRequest){
            (data, response, error)in
            guard let data = data else {
                return
            }
            do {
                print("base64 ------> ", data.base64EncodedString())
                // Approach 1
                // Load using PDFKit with data
                DispatchQueue.main.async {
                    //                pdfView.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor).isActive = true
                    //                pdfView.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor).isActive = true
                    //                pdfView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true
                    //                pdfView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor).isActive = true
                    self.pdfView.translatesAutoresizingMaskIntoConstraints = false
                    self.pdfView.autoScales = true
                    self.pdfView.displayMode = .singlePageContinuous
                    self.pdfView.displayDirection = .vertical
                    let doc = PDFDocument(data: data)
                    self.pdfView.document = doc
                }

标签: iosswiftionic-frameworkcapacitorcapacitor-plugin

解决方案


您可以简单地使用QLPreviewControllerQLPreviewControllerDataSource实现 PDF 预览。你也可以使用delegate改变一些行为。

注意:如果您只有 1 个元素,则根本不需要在 previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem 方法中使用 index 参数

import UIKit
import Quicklook


class YourViewController: UIViewController {
    // better to inject or use some service
    private let previewViewController = QLPreviewController()

    override func viewDidLoad() {
        super.viewDidLoad()
        previewViewController.dataSource = self // Setting the dataSource and delegate if needed
    }

    override viewDidAppear() {
        super.viewDidAppear()
        present(previewViewController.dataSource, animated: true)
    }
}

extension YourViewController: QLPreviewControllerDataSource {
    func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        return 1 // number of PDF items
    }

     func previewController(_ controller: QLPreviewController, 
                        previewItemAt index: Int) -> QLPreviewItem {
        guard let url = Bundle.main.url(forResource: String(index), withExtension: "pdf") else {
            fatalError("Could not load \(index).pdf")
        } // Your URL

        return url as QLPreviewItem
    }
}

警告:在推入导航堆栈的情况下存在与 QLPreviewController 相关的问题,因此最好呈现它。检查相关答案Quicklook/QLPreviewController 在 ios 8 上显示空白页而不是 pdf,但在 iOS7 上工作正常


推荐阅读