В последнее время появилось много вопросов о создании PDF файлов.
Да, вы можете очень легко визуализировать PDF с помощью UIWebView
, но это не дает производительности и функциональности, которые вы ожидаете от хорошего просмотра PDF.
Вы можете нарисовать страницу PDF в CALayer или в UIImage. У Apple даже есть пример кода, чтобы показать, как рисовать большой PDF в Zoomable UIScrollview
Но те же проблемы продолжают возникать.
Метод UIImage:
- PDF в
UIImage
не оптически масштаб, а также подход уровня. - ЦП и память попали в
UIImages
из aPDFcontext
ограничивает/препятствует его использованию для создания рендеринг в реальном времени новых уровней масштабирования.
Метод CATiledLayer:
- Theres существенные накладные расходы (время)
рисование полной страницы PDF на
CALayer
: отдельные фрагменты можно увидеть рендерингом (даже с настройкой tileSize) -
CALayers
не может быть подготовлен раньше время (отображается вне экрана).
Как правило, зрители в формате PDF слишком тяжелы в памяти. Даже отслеживайте использование памяти с помощью масштабируемого PDF файла.
В моем текущем проекте я разрабатываю средство просмотра PDF и просматриваю UIImage
страницы в отдельном потоке (здесь тоже проблемы!) и представляю ее, пока масштаб равен x1. CATiledLayer
рендеринг ударов, как только масштаб будет > 1. iBooks использует подобный подход двойного подхода, как если бы вы прокручивали страницы, на которые вы можете увидеть более низкую версию версии, всего за секунду, прежде чем появится четкая версия.
Im рендерит 2 страницы с каждой стороны страницы в фокусе, чтобы изображение в формате PDF было готово замаскировать слой до начала рисования. Страницы снова уничтожаются, когда они находятся на +2 страницах от сфокусированной страницы.
Есть ли у кого-нибудь какие-либо идеи, независимо от того, насколько мало или очевидно улучшить производительность/память для рисования PDF файлов? или любые другие вопросы, обсуждаемые здесь?
РЕДАКТИРОВАТЬ: Некоторые советы (Credit-Luke Mcneice, VdesmedT, Matt Gallagher, Johann):
-
Сохраните любой носитель на диске, когда сможете.
-
Используйте большие размеры tileSizes, если рендеринг на TiledLayers
-
init часто используются массивы с объектами-заполнителями, альтернативно другой подход к разработке этот
-
Обратите внимание, что изображения будут отображаться быстрее, чем
CGPDFPageRef
-
Используйте
NSOperations
или GCD и Blocks, чтобы подготовить страницы вперед времени. -
вызывать
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
доCGContextDrawPDFPage
, чтобы уменьшить использование памяти при рисовании -
init'ing вашего
NSOperations
с docRef - плохая идея (память), оберните docRef в одноэлементный. -
Отменить needless
NSOperations
Если вы можете, особенно если они будут использовать память, остерегайтесь оставлять контексты открытыми, хотя! -
Утилизировать страницы страниц и уничтожить неиспользуемые представления
-
Закройте все открытые контексты, как только они вам не понадобятся.
-
при получении предупреждений памяти отпустите и перезагрузите DocRef и любую страницу Cache
Другие возможности PDF:
-
Получение ссылок внутри PDF (и здесь и здесь)
-
Получение цели ссылки (Получение номера страницы из массива
/Dest
)
-
Получение исходного текста (и здесь и Здесь и здесь (сфокусировано позиционирование))
-
Поиск (и здесь) (не работает с все PDF файлы (некоторые просто показывают странные символы, я думаю, это проблема с кодировкой, но я не уверен) -Credit BrainFeeder)
-
CALayer и Off-Screen Rendering - отобразите следующую страницу для быстрого/плавного отображения
Documentation
- Quartz PDFObjects (используется для метаинформации, аннотаций, больших пальцев)
- Abobe PDF Spec
Примеры проектов
- Apple/ZoomingPDF - масштабирование,
UIScrollView
,CATiledLayer
- vfr/reader - масштабирование, подкачка,
UIScrollView
,CATiledView
- брови/листья - пейджинг с приятными переходами
- /skim - все, что кажется (PDF-ридер/редактор для OSX)