ローカルファイルからpdfファイルを表示できるようなxcode iOS
のオフラインビルドの方法があるかどうかを知りたいです。
現在使用しているメソッドは、PDF URL(オンライン)を含むカスタムHTMLを表示するためにUIWebView
を介していますが、可能であればオフラインバージョンを作成します。
しかし、オンライン調査から、PDFを表示する唯一の方法はUIWebViewを使用することです。実際にそうである場合、ローカルリソースからファイルをプルすることは可能ですか(たとえば、xcodeリソースにファイルを追加するフォルダー)PDF URLを使用するのではなく。
オフトピック:どちらが良い選択でしょうか?ローカルファイルを取得するか、PDFファイルのオンラインURLを使用するには?
UIWebView
には接続が必要なため、最新で更新されているため、オンラインURLを取得することをお勧めします。
フィードバックは大歓迎です。
編集:簡単な質問、UIDocumentInteractionController
メソッドまたは QuickLookフレームワーク を使用してオフラインにする場合、これは新しいPDF記事が追加されました(間違っている場合は修正してください)
この点を考慮して、私はその場で自分の質問に対する反論を思いつきました(あなたが私の時間を無駄にしていると感じたらごめんなさい>。<、私は可能性に疑問を持ちたい人です問題を解決するために取ることができる別のアプローチ)一定の更新から時間を節約し、UIWebViewを使用するリアルタイムベースのソリューションを提供する場合(これはこのSOの目的に反することを知っています) _スレッド)、このプロジェクトはオンラインWebサイト(そこからコンテンツとソースを取得)に基づいているため、記事セクションにWebサイトをロードする場合、NSString変数を追加することにより、 URLがニュースセクションとPDF URLから離れないように、NSRange関数をUIWebViewとともにviewDidLoadに追加できます。例えばifとNSRange関数の組み合わせを使用して、URLにニュースセクションとPDF URLのみが含まれていることを確認します。
NSRange関数の前に電卓のポイントを1回実行したことがあるので、このフレームワークアプリで使用するのに良い時期だと思いました。
追伸-このアプリは組織の基本プロジェクトであり、私は彼らに基本スケルトンフレームワークを提供するインターンです。
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];
}
多くのオプション、ここに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 Viewerを、リンゴのように構築することです ZoomingPDFViewerサンプルコード 。(UIPageViewController + CATiledLayer + UIScrollViewを使用)
PDFファイルを処理する際に QuickLookフレームワーク を使用することをお勧めします。
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)
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];
私はこのサイトを見つけました。iPhoneにロードされている任意のPDF対応アプリでPDFを開く非常に簡単な方法です。 (iBooksが好きです)
私の場合、選択した行または詳細インジケーターのいずれかに基づいてPDFViewに移行するtableViewがあります(アプリのさまざまな部分にそれぞれ2つの異なる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と関係があるのでしょうか?
UIDocumentInteractionControllerを使用することもできます!
let docController = UIDocumentInteractionController(url: URL(fileURLWithPath: path)) documentInteractionController.presentPreview(animated: true)
遅くなりましたが、PDFファイルの読み込みにはUIWebviewにいくつかの制限があり、編集可能なPDFを適切に読み込みません。あらゆる種類のPDFファイルをロードするには、次のコードを使用します
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"pdfFileName" ofType:@"pdf"]];
PDFView *view = [[PDFView alloc] initWithFrame:self.view.frame];
view.document = [[PDFDocument alloc] initWithURL:url];
[self.view addSubview:view];
私たちはiOSのコーダーであり、JS/Webプログラマーではないので、Swift and Apple API。
私はカリマークスを引用します。
とにかくコードはとても簡単です:
// 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
}
}
AppleのPDFKitフレームワークは、私たちがPDFを操作するのに役立つ膨大なコードを提供します。最も便利なものの1つは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を作成し、そこからPDFDocumentオブジェクトを作成し、PDFビュー:
guard let path = Bundle.main.url(forResource: "example", withExtension: "pdf") else { return }
if let document = PDFDocument(url: path) {
pdfView.document = document
}
できた!