Статьи

Чтение и отображение документов PDF

Работа с необработанными документами PDF может быть трудоемкой и разочаровывающей задачей. Из этого туториала вы узнаете, как использовать библиотеку VFR для быстрого доступа, просмотра и просмотра документов PDF в ваших собственных приложениях!

Существует много сценариев, в которых может возникнуть необходимость отобразить PDF в приложении для iOS. При этом может быть много сложностей в правильном отображении PDF-файлов. Есть также дополнительные функции, такие как печать, отправка по электронной почте, просмотр закладок, обработка ротации и многое другое, что следует учитывать. Хотя многие из этих функций могут быть несложными для включения, некоторые могут быть очень сложными для правильной работы.

PDF Viewer Конечный продукт

Для этого приложения мы начнем с создания нового проекта Xcode в виде «приложения с одним представлением». Также мы будем использовать ARC, поэтому убедитесь, что установлен флажок «Использовать автоматический подсчет ссылок».

Новый проект

Наша библиотека PDF «Reader» требует добавления нескольких дополнительных платформ в наш проект: QuartzCore, ImageIO и MessageUI.

Если вы уже знакомы с добавлением фреймворков в проект, то можете пропустить следующую часть и перейти к разделу «Добавление библиотеки в наш проект».

В противном случае, чтобы добавить эти фреймворки, нажмите на свой проект в Навигаторе проектов. Выберите цель, затем найдите вкладку «Фазы сборки» вверху. В разделе «Этапы сборки» разверните раздел «Связать двоичные файлы с библиотеками» и нажмите кнопку «+» в левом нижнем углу.

Обязательные рамки

Теперь добавьте необходимые фреймворки (QuartzCore, ImageIO, MessageUI).

Добавить необходимые рамки

Ваш раздел «Link Binary With Options» теперь должен выглядеть следующим образом:

Необходимые рамки были добавлены

Нашу библиотеку PDF «Reader» можно скачать с GitHub здесь: https://github.com/vfr/Reader . Теперь мы можем перетащить нашу библиотеку «Reader» в наш проект, и мы почти готовы начать. Я создал новую группу в своем проекте под названием «PDF Reader», где я добавляю библиотеку (вам нужно только включить каталоги «Sources» и «Graphics»).

Добавить библиотеку «Читатель»

К сожалению, на данный момент «Reader» не готов к ARC. Итак, нам придется сделать некоторый рефакторинг. Есть три (3) файла, которые нам нужно будет обновить вручную, прежде чем мы сможем сказать XCode рефакторинг для ARC: «ReaderDocument.m», «ReaderContentPage.m» и «ReaderThumbFetch.m» (для справки вы можете найти Основные инструкции для этих файлов здесь: http://www.vfr.org/2012/05/reader-arc-conversion/ .)

По сути, мы собираемся отредактировать каждый из этих файлов, чтобы использовать простые преобразования __bridge, например:

ReaderDocument.m:

+ Изменить

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

чтобы …

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

ReaderContentPage.m:

+ Изменить

... = CGPDFDocumentCreateX((CFURLRef)fileURL, phrase);

чтобы …

... = CGPDFDocumentCreateX((__bridge CFURLRef)fileURL, phrase);

ReaderThumbFetch.m:

+ Изменить

... = CGImageSourceCreateWithURL((CFURLRef)thumbURL,

чтобы …

... = CGImageSourceCreateWithURL((__bridge CFURLRef)thumbURL, NULL);

С внесенными выше изменениями, перейдите в Edit> Refactor> Convert to Objective-C ARC …

Рефакторинг для ARC

Вам будет предложено «Выберите цели для преобразования». Убедитесь, что ваша текущая цель выбрана, затем нажмите «Проверить» .

Проверьте цель для рефакторинга

Приглашение проведет вас через весь процесс, вы можете просто нажать «Далее» без проблем.

Рефакторинг «Следующий» шаг

После этого вы сможете просмотреть изменения и выбрать «Сохранить» .

Рефакторинг «Сохранить»

Наконец, нам нужно включить наш заголовок библиотеки «Reader» в наш основной ViewController.h и установить наш контроллер основного представления как ReaderViewControllerDelegate :

#import "ReaderViewController.h"

@interface MTViewController: UIViewController <ReaderViewControllerDelegate>

Сложная часть настройки нашего проекта закончена. С этого момента можно быстро приступить к просмотру PDF-файлов в наших приложениях — в комплекте с печатью, закладками, миниатюрами, электронной почтой и многим другим!

Прежде всего, давайте добавим демонстрационный PDF в наш проект. Еще раз, я создал новую группу, которую я назвал «PDFs».

Затем я добавил PDF-файл с именем «typo_tips.pdf», который я скачал с fontshop.com, в «каталог ресурсов», который вы можете использовать ( прямая ссылка ). Конечно, не стесняйтесь попробовать любой PDF, который у вас уже есть.

Добавить наш PDF

Чтобы открыть наш PDF, мы добавим один UIButton в наш основной ViewController.xib.

Добавьте наш UIButton

Затем мы подключим наш UIButton к методу, который мы будем вызывать didClickOpenPDF .

Назначить наш UIButton его метод

Остальная часть работы будет обрабатываться в рамках этого метода didClickOpenPDF в нашем главном ViewController.m.

Сначала мы возьмем наш PDF-документ из нашего пакета приложений.

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

Далее мы создадим «ReaderDocument», который наш «Reader» сможет просматривать. Обратите внимание, что если бы наш документ был защищен паролем, мы могли бы установить пароль в качестве последнего параметра.

1
ReaderDocument *document = [ReaderDocument withDocumentFilePath:file password:nil];

Затем мы проверяем, что наш «ReaderDocument» был успешно создан, прежде чем реализовывать наш «ReaderViewController», который будет обрабатывать остальные операции PDF для нас.

1
2
3
if (document != nil)
{
}

И между скобками в проверке «документ» мы загрузим наш объект «ReaderViewController».

1
2
3
4
5
if (document != nil)
{
    ReaderViewController *readerViewController = [[ReaderViewController alloc] initWithReaderDocument:document];
    readerViewController.delegate = self;
}

В этом примере мы представим наш «ReaderViewController» как модальное представление, хотя мы могли бы альтернативно представить его с UINavigationController, если бы наше приложение использовало UINavigationController. У нас есть различные варианты стиля представления и перехода, которые мы могли бы использовать для нашего ModalViewController, поэтому я рекомендую вам поэкспериментировать со стилями, которые лучше всего подходят для вашего приложения. В этом случае мы попытаемся имитировать нативный стиль Apple PDF от iBooks.

Добавьте следующие строки после «readerViewController.delegate = self;».

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

Наконец, нам нужно представить наш ModalViewController:

1
[self presentModalViewController:readerViewController animated:YES];

Как вы можете видеть, после того, как мы включили нашу библиотеку «Reader», относительно просто просматривать и взаимодействовать с PDF-файлами в наших приложениях для iOS. Вот весь метод, который мы использовали:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
— (IBAction)didClickOpenPDF:(UIButton *)sender {
NSString *file = [[NSBundle mainBundle] pathForResource:@»typo_tips» ofType:@»pdf»];
     
ReaderDocument *document = [ReaderDocument withDocumentFilePath:file password:nil];
 
if (document != nil)
{
    ReaderViewController *readerViewController = [[ReaderViewController alloc] initWithReaderDocument:document];
    readerViewController.delegate = self;
     
    readerViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    readerViewController.modalPresentationStyle = UIModalPresentationFullScreen;
     
    [self presentModalViewController:readerViewController animated:YES];
}
}

Если вы запустите и создадите наше приложение сейчас, вы увидите множество функций, уже работающих для вашей программы просмотра PDF.

Конечный продукт

Есть только одна последняя вещь, которую мы должны обработать: закрытие нашего PDF Reader ViewController, когда пользователь нажимает кнопку «Готово».

Это обрабатывается простым, простым методом:

1
2
3
— (void)dismissReaderViewController:(ReaderViewController *)viewController {
    [self dismissModalViewControllerAnimated:YES];
}

Как упоминалось ранее, библиотека «Reader» поддерживает многие из этих функций, помимо отображения PDF-файлов, такие как печать, закладки и т. Д. По умолчанию большинство этих функций включено. Тем не менее, вы можете выбрать их для каждого приложения, отредактировав файл «ReaderConstants.h». Каждая из этих функций перечислена на странице GitHub «Reader», которую я покажу здесь:

  • READER_BOOKMARKS — если TRUE, включает поддержку закладки страницы.
  • READER_ENABLE_MAIL — если TRUE, кнопка электронной почты добавляется на панель инструментов
    (если устройство правильно настроено для поддержки по электронной почте).
  • READER_ENABLE_PRINT — если TRUE, кнопка печати добавляется на панель инструментов
    (если печать поддерживается и доступна на устройстве).
  • READER_ENABLE_THUMBS — если TRUE, кнопка превью добавлена ​​на панель инструментов
    (Включение навигации по миниатюрам страниц документа).
  • READER_DISABLE_IDLE — если TRUE, таймер простоя iOS отключен во время
    просмотр документа (остерегайтесь разряда батареи).
  • READER_SHOW_SHADOWS — если TRUE, тень отображается на каждой странице
    и содержание страницы вставлено парой дополнительных пунктов.
  • READER_STANDALONE — если FALSE, кнопка «Готово» добавляется на панель инструментов
    и -dismissReaderViewController: метод делегата передается, когда
    это прослушивается.
  • READER_DISABLE_RETINA — если TRUE, устанавливает CATiledLayer contentScale
    до 1.0f. Это эффективно отключает поддержку сетчатки и приводит к
    скорости рендеринга устройств без сетчатки на устройствах дисплея сетчатки при
    потеря качества отображения сетчатки.

Теперь вы видели, как легко можно просматривать PDF-файлы в iOS. В следующем руководстве этой серии мы рассмотрим некоторые способы создания собственных PDF-файлов в наших приложениях.