使用 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 而不下载文件
Swift PDF 渲染任何 UIView 或 UIViewController PDFKit
PDFKit - PDFThumbnailView 跳过页面而不是显示连续页面 - swift