Lectura y visualización de documentos PDF

Trabajar con documentos PDF en bruto puede ser una tarea frustrante y que consume mucho tiempo. Este tutorial le enseñará cómo usar la Biblioteca VFR para acceder, mostrar y explorar documentos PDF rápidamente dentro de sus propias aplicaciones.!

Introducción

Hay muchos escenarios en los que puede ser necesario mostrar un PDF en una aplicación iOS. Al hacerlo, puede haber muchas complicaciones para que los archivos PDF se procesen correctamente. También hay características adicionales como la impresión, el envío por correo electrónico, la visualización de marcadores, el manejo de la rotación y más que deben tenerse en cuenta. Si bien es posible que muchas de estas funciones no sean complicadas de incluir, algunas pueden ser muy difíciles de hacer funcionar correctamente..

Paso 1: instalar la biblioteca VFR

Para esta aplicación, comenzaremos por crear un nuevo proyecto de Xcode como una "Aplicación de vista única". Además, usaremos ARC, así que asegúrese de que la casilla "Usar conteo automático de referencias" esté marcada.

Marcos Requeridos

Nuestra biblioteca "Reader" de PDF requiere que se agreguen algunos marcos adicionales a nuestro proyecto: QuartzCore, ImageIO y MessageUI.

Si ya está familiarizado con la adición de marcos a un proyecto, puede omitir la siguiente parte y acceder directamente a "Agregar la biblioteca a nuestro proyecto"..

De lo contrario, para agregar esos marcos, haga clic en su Proyecto desde el Navegador de proyectos. Elige tu objetivo, luego encuentra la pestaña "Crear fases" en la parte superior. Debajo de "Crear fases", expanda la sección "Vincular binarios con bibliotecas" y luego haga clic en el botón "+" en la esquina inferior izquierda.

Ahora, agregue los marcos necesarios (QuartzCore, ImageIO, MessageUI).

Tu sección de "Enlace binario con opciones" ahora debería verse así:

Añadiendo la biblioteca a nuestro proyecto

Nuestra biblioteca "Reader" de PDF se puede descargar desde GitHub aquí: https://github.com/vfr/Reader. Ahora podemos arrastrar nuestra biblioteca "Reader" a nuestro proyecto y estamos casi listos para comenzar. He creado un nuevo Grupo en mi proyecto llamado "PDF Reader" donde agrego la biblioteca (solo necesita incluir los directorios "Fuentes" y "Gráficos").

Desafortunadamente, en este punto, "Reader" no está preparado para ARC. Entonces, tendremos que hacer algo de refactorización. Hay tres (3) archivos que necesitaremos actualizar manualmente antes de que podamos indicar a Xcode que refactorice para ARC: "ReaderDocument.m", "ReaderContentPage.m" y "ReaderThumbFetch.m" (para referencia, puede encontrar Instrucciones básicas para estos archivos aquí: http://www.vfr.org/2012/05/reader-arc-conversion/.)

Básicamente, lo que vamos a hacer es editar cada uno de estos archivos para usar los modelos de __bridge, así:

ReaderDocument.m:

Cambio

… = [NSString stringWithString: (id) theString];

a
…

= [NSString stringWithString: (__ bridge id) theString];

ReaderContentPage.m:

Cambio

… = CGPDFDocumentCreateX ((CFURLRef) fileURL, frase);

a…

… = CGPDFDocumentCreateX ((__ bridge CFURLRef) fileURL, frase);

ReaderThumbFetch.m:

Cambio

… = CGImageSourceCreateWithURL ((CFURLRef) thumbURL,

a…

… = CGImageSourceCreateWithURL ((__ bridge CFURLRef) thumbURL, NULL);

Con los cambios anteriores realizados, vaya a Editar> Refactorizar> Convertir a Objective-C ARC ...

Se le pedirá que seleccione "Objetivos a convertir". Asegúrese de que su objetivo actual esté seleccionado, luego presione "Comprobar".

El aviso lo guiará a través del proceso, usted debería poder simplemente presionar "Siguiente" sin problema.

Luego podrá "Revisar cambios" y puede seleccionar "Salvar".

Finalmente, debemos incluir nuestro encabezado de biblioteca "Reader" en nuestro principal ViewController.h y configurar nuestro controlador de vista principal como ReaderViewControllerDelegate:

#import "ReaderViewController.h"

@interface MTViewController: UIViewController

Paso 2: Configuración

La parte complicada de la configuración de nuestro proyecto ha terminado. Desde este punto, es un trabajo rápido comenzar a ver archivos PDF en nuestras aplicaciones, que se completa con la impresión, marcadores, miniaturas, correo electrónico y más.!

En primer lugar, vamos a agregar un PDF de demostración a nuestro proyecto. Una vez más, he creado un nuevo grupo, este he llamado "PDFs".

Luego, agregué un PDF llamado "typo_tips.pdf" que descargué de fontshop.com en el "directorio de recursos" que puede usar (enlace directo). Por supuesto, siéntase libre de probar cualquier PDF que ya tenga también.

Para abrir nuestro PDF, agregaremos un solo UIButton en nuestro ViewController.xib principal.

Luego conectaremos nuestro UIButton a un método que llamaremos didClickOpenPDF.

El resto del trabajo se manejará dentro de este método "didClickOpenPDF" en nuestro principal ViewController.m.

Primero, tomaremos nuestro documento PDF de nuestro paquete de aplicaciones..

 NSString * file = [[NSBundle mainBundle] pathForResource: @ "typo_tips" ofType: @ "pdf"];

A continuación, crearemos un "ReaderDocument" que nuestro "Reader" podrá ver. Tenga en cuenta que, si nuestro documento estuviera protegido por contraseña, podríamos establecer la contraseña como el parámetro final.

 ReaderDocument * document = [ReaderDocument withDocumentFilePath: archivo contraseña: nil];

A continuación, nos aseguramos de que nuestro "ReaderDocument" se haya creado correctamente, antes de implementar nuestro "ReaderViewController", que manejará el resto de las operaciones de PDF por nosotros..

 si (documento! = nil) 

Y entre las llaves en la comprobación de "documento", cargaremos nuestro objeto "ReaderViewController".

 if (document! = nil) ReaderViewController * readerViewController = [[ReaderViewController alloc] initWithReaderDocument: document]; readerViewController.delegate = self; 

En este ejemplo, presentaremos nuestro "ReaderViewController" como una vista modal, aunque alternativamente podríamos presentarlo con un UINavigationController si nuestra aplicación estuviera utilizando un UINavigationController. Tenemos varias opciones para el estilo de presentación y transición que podríamos usar para nuestro ModalViewController, por lo que lo invito a experimentar con los estilos que mejor se adapten a su aplicación. En este caso, intentaremos imitar el estilo de Apple PDF nativo de iBooks.

Agregue las siguientes líneas después de "readerViewController.delegate = self;".

 readerViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; readerViewController.modalPresentationStyle = UIModalPresentationFullScreen;

Por último, necesitamos presentar nuestro ModalViewController:

 [self presentModalViewController: readerViewController animated: YES];

Como puede ver, una vez que hemos incluido nuestra biblioteca "Reader", es relativamente sencillo ver e interactuar con archivos PDF en nuestras aplicaciones iOS. Aquí está el método completo que usamos:

 - (IBAction) didClickOpenPDF: (UIButton *) sender NSString * file = [[NSBundle mainBundle] pathForResource: @ "typo_tips" ofType: @ "pdf"]; ReaderDocument * document = [ReaderDocument withDocumentFilePath: archivo contraseña: nil]; if (document! = nil) ReaderViewController * readerViewController = [[ReaderViewController alloc] initWithReaderDocument: document]; readerViewController.delegate = self; readerViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; readerViewController.modalPresentationStyle = UIModalPresentationFullScreen; [self presentModalViewController: readerViewController animated: YES]; 

Si ejecuta y construye nuestra aplicación ahora, verá las muchas características que ya funcionan para su visor de PDF.

Solo hay una cosa final que debemos manejar: descartar nuestro PDF Reader ViewController cuando el usuario presiona el botón "Listo".

Esto se maneja con un método simple y directo:

 - (void) dismissReaderViewController: (ReaderViewController *) viewController [self dismissModalViewControllerAnimated: YES]; 

Paso 3: Opciones

Como se mencionó anteriormente, la biblioteca "Reader" admite muchas de estas funciones además de mostrar solo archivos PDF, como impresión, marcadores, etc. De manera predeterminada, la mayoría de estas funciones están habilitadas. Sin embargo, puede elegir configurar cada uno de ellos como mejor se adapte a su aplicación editando el archivo "ReaderConstants.h". Cada una de estas funciones se encuentra en la lista de "Lectores" de GitHub, que mostraré aquí:

  • READER_BOOKMARKS - Si es TRUE, habilita el soporte de marcadores de página.
  • READER_ENABLE_MAIL - Si es VERDADERO, se agrega un botón de correo electrónico a la barra de herramientas
    (si el dispositivo está configurado correctamente para soporte de correo electrónico).
  • READER_ENABLE_PRINT - Si es VERDADERO, se agrega un botón de impresión a la barra de herramientas
    (si la impresión es compatible y está disponible en el dispositivo).
  • READER_ENABLE_THUMBS - Si es VERDADERO, se agrega un botón de pulgares a la barra de herramientas
    (habilitando la navegación de documentos en miniatura de la página).
  • READER_DISABLE_IDLE - Si es TRUE, el temporizador de inactividad de iOS se deshabilita mientras
    Viendo un documento (cuidado con la descarga de la batería).
  • READER_SHOW_SHADOWS - Si es TRUE, se muestra una sombra alrededor de cada página
    y el contenido de la página está insertado por un par de puntos extra.
  • READER_STANDALONE - Si es FALSO, se agrega un botón "Hecho" a la barra de herramientas
    y el -dismissReaderViewController: el método delegado se envía cuando
    está girado.
  • READER_DISABLE_RETINA - Si es TRUE, establece el valor de CATiledLayer contentScale
    a 1.0f. Esto efectivamente desactiva el soporte de la retina y resulta en
    velocidades de renderización de dispositivos sin retina en dispositivos de visualización de retina en
    La pérdida de calidad de la pantalla de la retina..

La próxima vez: Escribir documentos PDF

Ahora has visto lo fácil que puede ser ver archivos PDF en iOS. En el siguiente tutorial de esta serie, veremos algunas de las formas de crear nuestros propios archivos PDF dentro de nuestras aplicaciones..