Ada banyak pertanyaan baru-baru ini tentang menggambar PDF.
Ya, Anda dapat membuat PDF dengan sangat mudah dengan UIWebView
tetapi ini tidak dapat memberikan kinerja dan fungsionalitas yang Anda harapkan dari penampil PDF yang baik.
Anda bisa menggambar halaman PDF ke CALayer atau ke UIImage . Apple bahkan memiliki kode sampel untuk menunjukkan cara menggambar PDF besar di ZoomIS UIScrollview
Namun masalah yang sama terus muncul.
Metode UIImage:
- PDF dalam
UIImage
skala tidak optik serta pendekatan Layer. - CPU dan memori menekan pada menghasilkan
UIImages
dariPDFcontext
batas / mencegah menggunakannya untuk membuat rendering tingkat-baru baru tingkat zoom.
Metode CATiledLayer:
- Ada Overhead yang signifikan (waktu) menggambar halaman PDF penuh ke
CALayer
: ubin individu dapat dilihat rendering (bahkan dengan tweak tileSize) CALayers
tidak dapat dipersiapkan sebelumnya (ditampilkan di luar layar).
Secara umum, pemirsa PDF juga memiliki memori yang cukup besar. Bahkan memantau penggunaan memori contoh PDF yang dapat diperbesar dari apel.
Dalam proyek saya saat ini, saya sedang mengembangkan penampil PDF dan saya merender UIImage
halaman dari utas yang terpisah (masalah di sini juga!) Dan menyajikannya sementara skalanya adalah x1. CATiledLayer
render tendangan dalam satu kali skalanya> 1. iBooks mengambil pendekatan pengambilan ganda yang serupa seolah-olah Anda menggulir halaman, Anda dapat melihat versi res halaman yang lebih rendah hanya kurang dari satu detik sebelum versi yang tajam muncul.
Saya membuat 2 halaman setiap sisi halaman dalam fokus sehingga gambar PDF siap untuk menutupi lapisan sebelum mulai menggambar. Halaman dihancurkan lagi ketika mereka +2 halaman dari halaman fokus.
Adakah yang punya wawasan, betapapun kecil atau jelasnya untuk meningkatkan kinerja / penanganan memori dari Menggambar PDF? atau masalah lain yang dibahas di sini?
EDIT: Some Tips (Kredit- Luke Mcneice, VdesmedT, Matt Gallagher, Johann):
Simpan media apa saja ke disk saat Anda bisa.
Gunakan Ukuran tile yang lebih besar jika melakukan rendering pada TiledLayers
init sering digunakan array dengan objek penampung, atau pendekatan desain lain adalah yang satu ini
Perhatikan bahwa gambar akan merender lebih cepat dari a
CGPDFPageRef
Gunakan
NSOperations
atau GCD & Blok untuk menyiapkan halaman sebelumnya.panggil
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
sebelumnyaCGContextDrawPDFPage
untuk mengurangi penggunaan memori saat menggambarinit'ing Anda
NSOperations
dengan docRef adalah ide yang buruk (memori), bungkus docRef menjadi singleton.Batalkan yang tidak perlu
NSOperations
Ketika Anda bisa, terutama jika mereka akan menggunakan memori, berhati-hatilah membiarkan konteks tetap terbuka!Daur ulang objek halaman dan hancurkan tampilan yang tidak digunakan
Tutup semua Konteks terbuka segera setelah Anda tidak membutuhkannya
saat menerima peringatan memori lepaskan dan muat ulang DocRef dan Cache halaman apa saja
Fitur PDF lainnya:
Mendapatkan Tautan di dalam PDF (dan di sini dan di sini )
Mendapatkan target tautan (Mendapatkan nomor halaman dari
/Dest
array)
Judul dan Kata Kunci dokumen
Mendapatkan Teks Mentah (dan di sini dan di sini dan di sini (fokus pada posisi))
Mencari (dan di sini ) (tidak berfungsi dengan semua PDF (beberapa hanya menunjukkan karakter aneh, saya kira ini masalah penyandian tapi saya tidak yakin) -Credit BrainFeeder)
CALayer dan Off-Screen Rendering - render halaman berikutnya untuk tampilan cepat / halus
Dokumentasi
- Quartz PDFObjects (Digunakan untuk info meta, anotasi, jempol)
- Abobe PDF Spec
Contoh proyek
- Apple / ZoomingPDF - zooming
UIScrollView
,,CATiledLayer
- vfr / pembaca - zooming, paging
UIScrollView
,,CATiledView
- alis / daun - paging dengan transisi yang bagus
- / skim - sepertinya semuanya (PDF reader / editor untuk OSX)
PSPDFKit
, itu tidak murah, tetapi berharga: pspdfkit.comJawaban:
Saya telah membangun semacam aplikasi menggunakan pendekatan yang sama kecuali:
UIImage
tetapi menggambar gambar di layer ketika zoom adalah 1. Ubin-ubin itu akan dirilis secara otomatis ketika peringatan memori dikeluarkan.Setiap kali pengguna mulai melakukan zoom, saya memperoleh
CGPDFPage
dan membuatnya menggunakan CTM yang sesuai. Kode dalam- (void)drawLayer: (CALayer*)layer inContext: (CGContextRef) context
seperti:masalah adalah objek containg itu
CGPDFDocumentRef
. Saya menyinkronkan bagian di mana saya mengaksespdfDoc
properti karena saya melepaskannya dan membuatnya kembali ketika menerima memoryWarnings. TampaknyaCGPDFDocumentRef
objek melakukan caching internal yang saya tidak menemukan cara untuk menyingkirkannya.sumber
Untuk penampil PDF yang sederhana dan efektif, saat Anda hanya memerlukan fungsionalitas terbatas, sekarang Anda dapat (iOS 4.0+) menggunakan kerangka kerja QuickLook:
Pertama, Anda harus menautkan ke
QuickLook.framework
dan#import <QuickLook/QuickLook.h>;
Setelah itu, dalam salah satu
viewDidLoad
atau salah satu metode inisialisasi malas:sumber
Sejak iOS 11 , Anda dapat menggunakan kerangka kerja asli yang disebut PDFKit untuk menampilkan dan memanipulasi PDF.
Setelah mengimpor PDFKit, Anda harus menginisialisasi
PDFView
dengan URL lokal atau jauh dan menampilkannya dalam tampilan Anda.Baca lebih lanjut tentang PDFKit dalam dokumentasi Pengembang Apple.
sumber
sumber