使用 PDFKit Swift (ios)/Capacitor 加载 PDF 而不下载文件

Posted

技术标签:

【中文标题】使用 PDFKit Swift (ios)/Capacitor 加载 PDF 而不下载文件【英文标题】:Load PDF without downloading file using PDFKit Swift (ios)/Capacitor 【发布时间】:2021-08-24 04:37:22 【问题描述】:

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

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

P.S : 我对 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
                

【问题讨论】:

您可以使用PDFjs 查看您的文档。无需为此编写插件。还有其他文档视图插件可用。 我不想下载 pdf 并且 pdfjs 在模拟器中没有显示控制选项。我只想预览带有数据的文件(文件流/数据或临时 url)。 【参考方案1】:

您可以简单地使用QLPreviewController 和QLPreviewControllerDataSource 实现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 shows a blank page instead of pdf on ios 8 but works fine on iOS7

【讨论】:

以上是关于使用 PDFKit Swift (ios)/Capacitor 加载 PDF 而不下载文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 PDFKit Swift (ios)/Capacitor 加载 PDF 而不下载文件

如何在pdfkit swift中添加圆形注释?

Swift PDF 渲染任何 UIView 或 UIViewController PDFKit

PDFKit - PDFThumbnailView 跳过页面而不是显示连续页面 - swift

在 iOS 上使用 PDFKit.PDFView 打开 PDF

如何在 PDFView (swift PDFKit) 中注释圆角填充图像