web-dev-qa-db-ja.com

iOSでPDFを表示する方法

ローカルファイルから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回実行したことがあるので、このフレームワークアプリで使用するのに良い時期だと思いました。

追伸-このアプリは組織の基本プロジェクトであり、私は彼らに基本スケルトンフレームワークを提供するインターンです。

26

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];
            
}
34
self

多くのオプション、ここに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を使用)

37
calimarkus

PDFファイルを処理する際に QuickLookフレームワーク を使用することをお勧めします。

11
Rui Peres

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)
5
Argus

IOが導入した新しいツールキットがあります。 PDFの表示に関連する多くの専用機能があります。 PdfViewクラスを使用して、ローカルファイルまたはURL経由でPDFを表示できます。

PDFKit > PDFView

3
Rizan Zaky
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];
2
Ved Rauniyar

私はこのサイトを見つけました。iPhoneにロードされている任意のPDF対応アプリでPDFを開く非常に簡単な方法です。 (iBooksが好きです)

pdfファイルを表示して開く簡単な方法

2
user2616647

私の場合、選択した行または詳細インジケーターのいずれかに基づいて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座標と関係があると思いますが、一番上にロードする方法を理解できませんそのため、上部の背景が表示されます。

Simulator Screen Shot Link

おそらくこれはautoScalesと関係があるのでしょうか?

1
Tracker6

UIDocumentInteractionControllerを使用することもできます!

let docController = UIDocumentInteractionController(url: URL(fileURLWithPath: path)) documentInteractionController.presentPreview(animated: true)

1
Badre

遅くなりましたが、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];
1
Shaik Riyaz

私たちは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 
    }
}
0
ingconti

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
}

できた!

0
Ali A. Jalil