قم بتنزيل وحفظ وعرض ملف PDF في Swift

مساء الخير ، أقدم انتباهكم إلى ترجمة لمقال عن عمل PDF في Swift.
أي شخص مهتم ، مرحبا بكم في القطط.

أنا أعمل على تطبيق يمكنه تنزيل ملفات PDF وحفظها وفتحها. لهذه المهمة ، تحتاج إلى تنفيذ 3 خطوات:

  • مهمة التنزيل
  • إدارة الملفات
  • Pdfview

الخطوة 1. تنزيل المهام

لتنزيل ملف عبر عنوان 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.

بعد أن قمت بالنقر فوق الزر "تنزيل" ، تم تنزيل الملف في أقل من ثانية ثم تم قتله بواسطة النظام. يتكرر هذا السلوك على كل من المحاكي وعلى الجهاز الحقيقي.

الصورة

الخطوة 2. إدارة الملفات

لكل تطبيق في iOS بيئة اختبار خاصة به. يوجد بداخله 3 مكونات يجب أن يعرفها كل مطور iOS: Bundle Container و Data Container و iCloud Container. في هذه المقالة ، سننظر فقط في حاوية البيانات بمزيد من التفاصيل ، حيث سنحتاج إليها لمهمتنا - تنزيل ملف PDF.

الصورة

باستخدام حاوية البيانات ، يمكننا إدارة الملفات المحفوظة من الإنترنت. أدناه سوف أسرد الخصائص الهامة:

  • سيتم حذف الملفات الموجودة داخل المكتبة ، وكذلك ملفات tmp تلقائيًا
  • يقوم iTunes بعمل نسخة احتياطية لجميع الملفات باستثناء ذاكرة التخزين المؤقت ، tmp ، والملفات المحددة على أنها .isExcludedFromBackup = true . أثناء مراجعة التطبيق ، إذا وجدت Apple في iTines الملفات المحفوظة التي لا يجب أن تكون موجودة ، فمن المرجح أن يتم رفض التطبيق.
  • يجب تخزين الملفات المحفوظة في المستندات .

يتبع ذلك أن خطوتنا التالية هي حفظ الملف من tmp إلى Documents. هذا ما فعلته:

  1. نسخت اسم ملف pdf
  2. تم إنشاء عنوان url في المستندات
  3. تم حذف ملف بنفس الاسم لتجنب حدوث خطأ في النسخ: تعذر نسخ "CFNetworkDownload_mdrFNb.tmp" إلى "المستندات" نظرًا لوجود عنصر بنفس الاسم بالفعل.
  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 ، والآن يمكن للمستخدم الوصول إليه. دعنا الآن نكتشف كيفية فتحه باستخدام PDFView المدمج في PDFKit ، إطار عمل Apple المناسب المتاح مع iOS 11.

على الرغم من أن العديد من دروس PDFKit تستخدم لوحة العمل لإنشاء PDFView باستخدام خاصية UIView ، إلا أنه لا يمكن القيام بذلك من خلال 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 بمزيد من التفاصيل في المقالة التالية .

Source: https://habr.com/ru/post/ar430860/


All Articles