Baixe, salve e visualize PDF no Swift

Boa tarde, apresento a sua atenção a tradução de um artigo sobre o trabalho do PDF em Swift.
Qualquer pessoa interessada, bem-vindo ao gato.

Estou trabalhando em um aplicativo que deve poder baixar arquivos PDF, salvá-los e abri-los. Para esta tarefa, você precisa executar 3 etapas:

  • Downloadtask
  • Gerenciamento de arquivos
  • Pdfview

Etapa 1. DownloadTask

Para baixar um arquivo por meio de uma URL, você deve usar o downloadTask. Também é necessário rastrear para onde nossos arquivos foram movidos, de modo que o observador, que no meu caso é o ViewController , deve suportar 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) } } 

Para entender onde o arquivo foi salvo, basta imprimir a saída da variável location no console do Xcode.

Depois de clicar no botão "Download", o arquivo foi baixado em menos de um segundo e depois foi eliminado pelo sistema. Esse comportamento é repetido no simulador e no dispositivo real.

imagem

Etapa 2. Gerenciamento de Arquivos

Cada aplicativo no iOS tem seu próprio ambiente de teste. Dentro dele, existem três componentes que todo desenvolvedor de iOS deve conhecer: Bundle Container, Data Container e iCloud Container. Neste artigo, consideraremos apenas o Data Container com mais detalhes, pois precisaremos dele para nossa tarefa - baixar um arquivo PDF.

imagem

Usando o contêiner de dados, podemos gerenciar arquivos salvos da Internet. Abaixo vou listar as propriedades importantes:

  • Os arquivos dentro da Biblioteca e os arquivos tmp serão excluídos automaticamente
  • O iTunes faz backup de todos os arquivos, exceto Caches, tmp e arquivos designados como .isExcludedFromBackup = true . Durante a revisão do aplicativo, se a Apple encontrar no iTines arquivos salvos que não deveriam estar lá, provavelmente o aplicativo será rejeitado.
  • Os arquivos salvos devem ser armazenados em Documentos .

Segue-se que nosso próximo passo é salvar o arquivo de tmp em Documents. Aqui está o que eu fiz:

  1. Copiei o nome do arquivo pdf
  2. URL criado em documentos
  3. Excluiu um arquivo com o mesmo nome para evitar um erro de cópia: "CFNetworkDownload_mdrFNb.tmp" não pôde ser copiado para "Documentos" porque já existe um item com o mesmo nome.
  4. Copiou o arquivo para documentos.

 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)") } } } 

imagem

Etapa 3. PDFView

Então, movemos o arquivo PDF e agora o usuário tem acesso a ele. Vamos agora descobrir como abri-lo usando o PDFView embutido no PDFKit, a estrutura prática da Apple disponível no iOS 11.

Embora muitos tutoriais do PDFKit usem o storyboard para criar um PDFView usando a propriedade UIView, isso não pode ser feito através do Xibs . Portanto, vou criá-lo através do código.

 @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 } } 

imagem

Voila! Extraímos e abrimos o arquivo PDF. Sei que o formato do livro é um pouco diferente, e é por isso que veremos o PDFKit em mais detalhes no próximo artigo .

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


All Articles