Останнім часом було багато запитань щодо малювання PDF-файлів.
Так, ви можете візуалізувати PDF дуже легко за допомогою, UIWebView
але це не може забезпечити ефективність та функціональність, яких ви очікували від хорошого переглядача PDF.
Ви можете намалювати сторінку PDF в CALayer або до UIImage . Apple навіть має зразок коду, щоб показати, як намалювати великий PDF в Zoomable UIScrollview
Але ті самі питання продовжують з'являтися.
Метод UIImage:
- PDF-файли
UIImage
не в оптичному масштабі, а також підході шару. - Процесор і пам'ять вдарив по породжує
UIImages
від АPDFcontext
лімітів / НЕ дозволяє використовувати його для створення в реальному часі візуалізації нових зум-рівнів.
Метод CATiledLayer:
- Існує значне накладне (час) малювання повної сторінки PDF на
CALayer
: окремі плитки можна побачити візуалізацію (навіть при налаштуванні плитки розміру) CALayers
не можу бути готовим достроково (відображається поза екраном).
Як правило, глядачі PDF також досить важкі для пам'яті. Навіть слідкуйте за використанням пам'яті яблучного масштабного прикладу PDF.
У своєму поточному проекті я розробляю програму перегляду PDF-файлів і рендерую UIImage
сторінку в окремому потоці (питання теж тут!) І представляю її, поки масштаб становить x1. CATiledLayer
візуалізація ударів, коли масштаб дорівнює> 1. iBooks використовує аналогічний подвійний підхід, як якщо ви прокручуєте сторінки, ви побачите нижчу версію сторінки лише менше секунди, перш ніж з'явиться чітка версія.
Я надаю по 2 сторінки на кожній стороні сторінки у фокусі, щоб PDF-зображення було готове замаскувати шар, перш ніж воно почне малювати. Сторінки знову знищуються, коли вони знаходяться на +2 сторінки від зосередженої сторінки.
Хтось має уявлення, незалежно від того, наскільки мало або очевидно, щоб покращити продуктивність / обробку пам'яті для малювання PDF-файлів? чи будь-які інші питання, що обговорюються тут?
EDIT: Деякі поради (Credit - Luke Mcneice, VdesmedT, Matt Matt Gallagher, Johann):
Збережіть будь-який носій на диску, коли зможете.
Використовуйте більші розміри tile, якщо візуалізація на TiledLayers
init часто використовуються масиви з об'єктами-заповнювачами, але інший підхід дизайну - це цей
Зауважте, що зображення відображатимуться швидше, ніж a
CGPDFPageRef
Використовуйте
NSOperations
або GCD & Blocks для підготовки сторінок достроково.зателефонуйте
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
раніше,CGContextDrawPDFPage
щоб зменшити використання пам'яті під час малюванняinit'ing your
NSOperations
з docRef - це погана ідея (пам'ять), загортайте docRef в синглтон.Скасовуйте непотрібність
NSOperations
Коли ви зможете, особливо якщо вони будуть використовувати пам'ять, остерігайтеся залишати контексти відкритими!Переробляйте об’єкти сторінки та знищуйте невикористані представлення даних
Закрийте будь-які відкриті контексти, як тільки вони вам не знадобляться
при отриманні попереджень пам'яті випустіть і перезавантажте DocRef і будь-які кеші сторінок
Інші функції PDF:
Отримання посилань всередині PDF (і тут, і тут )
Отримання цілі посилання (Отримання номера сторінки з
/Dest
масиву)
Отримання сирого тексту (і тут, і тут, і тут (орієнтоване на позиціонування))
Пошук (і тут ) (працює не з усіма PDF-файлами (деякі просто показують дивні символи, я думаю, це проблема кодування, але я не впевнений) -Credit BrainFeeder)
CALayer та позаекранна візуалізація - візуалізація наступної сторінки для швидкого / плавного відображення
Документація
- Кварцові PDFObjects (використовується для метаінформації, приміток, великих пальців)
- Abebe PDF Spec
Приклад проектів
- Apple / ZoomingPDF - масштабування,
UIScrollView
,CATiledLayer
- VFR / читач - масштабування, пейджинг,
UIScrollView
,CATiledView
- лоб / листя - підкачка з приємними переходами
- / skim - все, що здається (зчитувач PDF / редактор для OSX)
PSPDFKit
, це не дешево, але варто: pspdfkit.com