SwiftでPDFをダウンロード、保存、表示する

こんにちは、SwiftでのPDFの操作に関する記事の翻訳をご紹介します。

興味のある方、猫へようこそ。



私は、PDFファイルをダウンロードして保存し、開くことができるはずのアプリケーションに取り組んでいます。 このタスクでは、3つのステップを実行する必要があります。





ステップ1. DownloadTask



URL経由でファイルをダウンロードするには、downloadTaskを使用する必要があります。 また、ファイルが移動した場所を追跡する必要があるため、オブザーバー(私の場合はViewController )はURLSessionDownloadDelegateをサポートする必要があります。



import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } @IBAction func downloadButtonPressed(_ sender: Any) { guard let url = URL(string: "https://www.tutorialspoint.com/swift/swift_tutorial.pdf") else { return } let urlSession = URLSession(configuration: .default, delegate: self, delegateQueue: OperationQueue()) let downloadTask = urlSession.downloadTask(with: url) downloadTask.resume() } } extension ViewController: URLSessionDownloadDelegate { func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { print("downloadLocation:", location) } }
      
      





ファイルが保存された場所を理解するには、Xcodeコンソールでロケーション変数の出力を印刷するだけです。



[ダウンロード]ボタンをクリックした後、ファイルは1秒未満でダウンロードされ、システムによって強制終了されました。 この動作は、シミュレーターと実際のデバイスの両方で繰り返されます。



画像



ステップ2.ファイル管理



iOSの各アプリケーションには、独自のテスト環境があります。 内部には、すべてのiOS開発者が知っておくべき3つのコンポーネントがあります:バンドルコンテナ、データコンテナ、およびiCloudコンテナ。 この記事では、データコンテナのみを詳細に検討します。これは、PDFファイルのダウンロードというタスクに必要になるためです。



画像



データコンテナを使用して、インターネットから保存されたファイルを管理できます。 以下に重要なプロパティをリストします。





次のステップは、tmpからDocumentsにファイルを保存することです。 ここに私がやったことがあります:



  1. pdfファイルの名前をコピーしました
  2. ドキュメントに作成されたURL
  3. コピーエラーを回避するために同じ名前のファイルを削除しました。同じ名前のアイテムが既に存在するため、「CFNetworkDownload_mdrFNb.tmp」を「Documents」にコピーできませんでした。
  4. ファイルをドキュメントにコピーしました。


 extension ViewController: URLSessionDownloadDelegate { func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { print("downloadLocation:", location) // create destination URL with the original pdf name guard let url = downloadTask.originalRequest?.url else { return } let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] let destinationURL = documentsPath.appendingPathComponent(url.lastPathComponent) // delete original copy try? FileManager.default.removeItem(at: destinationURL) // copy from temp to Document do { try FileManager.default.copyItem(at: location, to: destinationURL) self.pdfURL = destinationURL } catch let error { print("Copy Error: \(error.localizedDescription)") } } }
      
      





画像



ステップ3. PDFView



そのため、PDFファイルを移動し、ユーザーがアクセスできるようになりました。 次に、iOS 11で利用可能なAppleの便利なフレームワークPDFKitに組み込まれているPDFViewを使用して開く方法を考えてみましょう。



多くのPDFKitチュートリアルでは、 ストーリーボードを使用してUIViewプロパティを使用してPDFViewを作成していますが、これはXibsを介して行うことはできません。 したがって、コードを使用して作成します。



 @IBAction func openPDFButtonPressed(_ sender: Any) { let pdfViewController = PDFViewController() pdfViewController.pdfURL = self.pdfURL present(pdfViewController, animated: false, completion: nil) }
      
      





 import UIKit import PDFKit class PDFViewController: UIViewController { var pdfView = PDFView() var pdfURL: URL! override func viewDidLoad() { super.viewDidLoad() view.addSubview(pdfView) if let document = PDFDocument(url: pdfURL) { pdfView.document = document } DispatchQueue.main.asyncAfter(deadline: .now()+3) { self.dismiss(animated: true, completion: nil) } } override func viewDidLayoutSubviews() { pdfView.frame = view.frame } }
      
      





画像



出来上がり! PDFファイルを抽出して開きました。 本の形式が少し異なることを知っているので、次の記事でPDFKitをさらに詳しく見ていきます



All Articles