ios - 使用 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
}
解决方案
您可以简单地使用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 在 ios 8 上显示空白页而不是 pdf,但在 iOS7 上工作正常
推荐阅读
- c++ - 如何让 librdkafka C++ producer 示例在调试器下的 Windows 上工作?
- c# - 忽略文本文件中的第一列并将值转换为整数取决于组合框选择 c#
- excel - 将过滤后的表格数据传递给 ListBox
- sockets - 服务器不接受UDP数据包?
- xml - 如何绕过焦点辅助的吐司消息警报设置?
- javascript - 清洁编码 HTML 文本冒险游戏
- angular - Angular @syncfusion 颜色选择器生产错误
- apache-spark - 有没有办法知道 SparkSQL 查询是 DML 还是 DDL 语句?
- regex - 当 HTML 格式因情况而异时,如何使用 RegEx 从 HTML 标记中检索信息?
- ios - 如何在 SwiftUI 中自动播放(嵌入)youtube 视频