我想知道是否有任何方法可以为xcode iOS
进行离线构建,以便我们可以从本地文件显示pdf文件。
我现在使用的方法是通过UIWebView
来显示包含PDF URL(在线)的自定义HTML,但我想在可能的情况下制作离线版本。
但是从在线研究来看,在我看来,显示PDF的唯一方法是通过UIWebView,如果确实如此,是否可以从本地资源中提取文件(例如将文件添加到我的xcode资源文件夹)而不是使用PDF URL。
题外话: 哪个会是更好的选择?要提取本地文件或使用PDF文件的在线URL?
由于UIWebView
需要连接,因此只需提取在线网址就会是更好的选择,因为它将是最新的和更新的。
非常感谢您的反馈。
编辑:快速提问,如果我使用UIDocumentInteractionController
方法或QuickLook framework使其脱机,这意味着每次添加新的PDF文章时都必须发布更新补丁(正确我,如果我错了)
考虑到这一点,我当场就我自己的问题提出了一个反驳论点(对不起,如果有人觉得你在浪费时间在我身上>。<,我是一个人喜欢质疑可能性以及可以采取的解决问题的不同方法 为了节省时间不断更新并提供实时基础解决方案,即使用UIWebView(我知道这与我的SO线程的目的相矛盾),因为这个proj基于在线网站(获取我的内容)和来自那里的资源),如果我要为文章部分加载他们的网站,我会大胆地说通过添加NSString变量,我可以将NSRange函数与UIWebView一起添加到viewDidLoad中,这样URL永远不会离开新闻栏目和PDF网址。例如使用if和NSRange函数的组合来反击检查URL是否只包含新闻部分和PDF URL)
我在NSRange函数之前做了一次计算器上的点,所以我认为现在是将它用于这个框架应用程序的好时机。
P.S - 这个应用程序是一个组织基础项目,我是一个实习生,为他们提供基础骨架框架。
答案 0 :(得分:37)
许多选项,这里有3:
1)加载和显示本地pdf文件的最简单方法是使用类似的UIWebview:
NSString *path = [[NSBundle mainBundle] pathForResource:@"document" ofType:@"pdf"];
NSURL *targetURL = [NSURL fileURLWithPath:path];
NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
[webView loadRequest:request];
2)您还可以使用UIDocumentInteractionController
/ QLPreviewController
本地显示PDF文件。
3)另一种方法是构建自定义PDF查看器,如在apple ZoomingPDFViewer example code中。 (使用UIPageViewController + CATiledLayer + UIScrollView)
答案 1 :(得分:34)
您可以使用UIWebView直接从捆绑包中获取PDF,无需调用在线Web服务。
本地文件:
NSString *html = [NSString stringWithContentsOfFile:path1 encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:html baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]bundlePath]]];
远程文件:
- (void) loadRemotePdf
{
CGRect rect = [[UIScreen mainScreen] bounds];
CGSize screenSize = rect.size;
UIWebView *myWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0,screenSize.width,screenSize.height)];
webView.autoresizesSubviews = YES;
webView.autoresizingMask=(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);
NSURL *myUrl = [NSURL URLWithString:@"http://www.mysite.com/test.pdf"];
NSURLRequest *myRequest = [NSURLRequest requestWithURL:myUrl];
[webView loadRequest:myRequest];
[window addSubview: myWebView];
[myWebView release];
}
答案 2 :(得分:11)
我建议您在处理PDF文件时使用QuickLook framework。
答案 3 :(得分:5)
SWIFT 4.x
swift中的UIWebview方法:
//let url = URL.init(string: "https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf")! // for file in web
let url = Bundle.main.url(forResource: "filename", withExtension: ".pdf")! // for file in bundle
let webView = UIWebView.init(frame: view.frame)
webView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
webView.loadRequest(URLRequest.init(url: url))
view.addSubview(webView)
答案 4 :(得分:3)
答案 5 :(得分:2)
我找到了这个网站,并且是一个非常简单的方法,可以在iPhone上加载任何可用的pdf应用程序打开pdf。 (我更喜欢iBooks)
答案 6 :(得分:2)
NSString *path = [[NSBundle mainBundle] pathForResource:@"Yourpdf" ofType:@"pdf"];
NSURL *targetURL = [NSURL fileURLWithPath:path];
NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
UIWebView *webView=[[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 300, 400)];
[[webView scrollView] setContentOffset:CGPointMake(0,500) animated:YES];
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"window.scrollTo(0.0, 50.0)"]];
[webView loadRequest:request];
[self.view addSubview:webView];
答案 7 :(得分:1)
现在已经很晚了,但UIWebview在加载pdf文件方面存在一些限制,它不会正确加载可编辑的pdf。所以加载任何类型的pdf文件都使用以下代码
std::function<void(void)>
答案 8 :(得分:1)
在我的情况下,我有一个tableView根据选定的行或详细信息指示符连接到PDFView(在我的应用程序的不同部分中,每个都有两个不同的ViewController)。我有一个用于PDFView的@IBOutlet,并使用以下代码打开所需的PDF,并将其保存在应用程序中:
@IBOutlet weak var myPDFView: PDFView!
var mySelection = String()
override func viewDidLoad() {
super.viewDidLoad()
if let path = Bundle.main.path(forResource: mySelection, ofType: "pdf") {
let url = URL(fileURLWithPath: path)
if let myDocument = PDFDocument(url: url) {
myPDFView.document = myDocument
myPDFView.autoScales = true
myPDFView.displayMode = .singlePageContinuous
myPDFView.displayDirection = .vertical
myPDFView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
}
}
}
这一切都很好。正确的PDF可以轻松加载并按我的意愿填满屏幕。但是,PDF总是仅向上滚动一点,导致顶部隐藏在导航栏下方。请注意,在下面的屏幕截图中,文档的顶部不可见,但文档的底部仅在底部的标签栏上方。我认为这与从页面底部开始的PDF坐标有关,但无法弄清楚如何使其加载到文档的顶部,因此顶部的背景是可见的。
也许这与autoScales有关?
答案 9 :(得分:1)
您还可以使用UIDocumentInteractionController!
let docController = UIDocumentInteractionController(url: URL(fileURLWithPath: path))
documentInteractionController.presentPreview(animated: true)
答案 10 :(得分:0)
我们是iOS编码器,没有JS / Web程序员,因此请继续使用Swift和Apple API。 更快,更干净的方法是使用Quicklook。
我引用了calimarkus。
任何代码都很简单:
// Copyright © 2019 ing.conti. All rights reserved.
//
import UIKit
import QuickLook
class ViewController: UIViewController, QLPreviewControllerDataSource {
var previewController:QLPreviewController?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.previewController = QLPreviewController()
previewController!.dataSource = self
present(previewController!, animated: true)
}
//QL delegate:
func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
return 1
}
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
guard let url = Bundle.main.url(forResource: "SAMPLE", withExtension: "pdf") else {
fatalError("Could not load pdf")
}
return url as QLPreviewItem
}
}
答案 11 :(得分:0)
Apple的PDFKit框架提供了广泛的代码来帮助我们处理PDF,其中最有用的就是PDFView –它将PDF呈现到屏幕上并允许用户与其交互。
要尝试,请首先导入PDFKit框架:
import PDFKit
接下来,将此代码添加到您的viewDidLoad()方法中,以创建PDFView并填充所有可用空间:
let pdfView = PDFView()
pdfView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(pdfView)
pdfView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
pdfView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
pdfView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
pdfView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
最后,创建一个指向捆绑软件中某个地方(或文档目录中一个)的PDF的URL,然后从该URL创建一个PDFDocument对象,并将其传递给PDF视图:
guard let path = Bundle.main.url(forResource: "example", withExtension: "pdf") else { return }
if let document = PDFDocument(url: path) {
pdfView.document = document
}
完成!