Recentemente ci sono state molte domande sul disegno di PDF.
Sì, puoi rendere i PDF molto facilmente con un UIWebView
ma questo non può dare le prestazioni e le funzionalità che ti aspetteresti da un buon visualizzatore di PDF.
È possibile disegnare una pagina PDF su un CALayer o su un UIImage . Apple ha persino un codice di esempio per mostrare come disegnare un PDF di grandi dimensioni in UIScrollview Zoomable
Ma gli stessi problemi continuano a emergere.
Metodo UIImage:
- I PDF sono in
UIImage
scala non otticamente e anche a livello. - La CPU e la memoria colpiscono generando il
UIImages
da unPDFcontext
limite / impedisce di usarlo per creare un rendering in tempo reale di nuovi livelli di zoom.
Metodo CATiledLayer:
- C'è un notevole sovraccarico (tempo) che disegna una pagina PDF completa in un
CALayer
: è possibile visualizzare il rendering di singole tessere (anche con una modifica della piastrella) CALayers
non può essere preparato in anticipo (reso fuori dallo schermo).
Generalmente anche i visualizzatori di PDF hanno una memoria piuttosto pesante. Monitora anche l'utilizzo della memoria dell'esempio PDF zoomabile di Apple.
Nel mio progetto attuale, sto sviluppando un visualizzatore di PDF e sto eseguendo il rendering di una UIImage
di una pagina in un thread separato (problemi anche qui!) E presentandolo mentre la scala è x1. CATiledLayer
il rendering entra in funzione quando la scala è> 1. iBooks adotta un approccio simile a doppio approccio, come se si scorre le pagine è possibile vedere una versione a bassa risoluzione della pagina per appena meno di un secondo prima che appaia una versione nitida.
Sto mettendo a fuoco 2 pagine su ciascun lato della pagina in modo che l'immagine PDF sia pronta per mascherare il livello prima che inizi a disegnare. Le pagine vengono nuovamente distrutte quando si trovano a +2 pagine dalla pagina focalizzata.
Qualcuno ha qualche intuizione, non importa quanto piccolo o ovvio per migliorare le prestazioni / gestione della memoria di Drawing PDF? o altri problemi discussi qui?
EDIT: Alcuni suggerimenti (credito - Luke Mcneice, VdesmedT, Matt Gallagher, Johann):
Salvare qualsiasi supporto su disco quando è possibile.
Usa dimensioni delle piastrelle più grandi se esegui il rendering su TiledLayers
init usa frequentemente array con oggetti segnaposto, alternativamente un altro approccio progettuale è questo
Si noti che le immagini verranno visualizzate più velocemente di a
CGPDFPageRef
Utilizzare
NSOperations
o GCD e blocchi per preparare le pagine in anticipo.chiamare
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
primaCGContextDrawPDFPage
per ridurre l'utilizzo della memoria durante il disegnoIniziare il tuo
NSOperations
con un docRef è una cattiva idea (memoria), avvolgere il docRef in un singleton.Annulla inutile
NSOperations
Quando puoi, specialmente se useranno la memoria, fai attenzione a lasciare aperti i contesti!Ricicla gli oggetti della pagina e distruggi le viste inutilizzate
Chiudi tutti i contesti aperti non appena non ti servono
alla ricezione di avvisi di memoria rilasciare e ricaricare DocRef e le eventuali cache delle pagine
Altre caratteristiche PDF:
Ottenere collegamenti all'interno di un PDF (e qui e qui )
Comprensione del PDF Rect per il posizionamento dei collegamenti
Ottenere la destinazione del collegamento (Ottenere il numero di pagina
/Dest
dall'array)
Ottenere testo non elaborato (e qui e qui e qui (posizionamento focalizzato))
Ricerca (e qui ) (non funziona con tutti i PDF (alcuni mostrano solo caratteri strani, immagino sia un problema di codifica ma non ne sono sicuro) -Credit BrainFeeder)
CALayer e Off-Screen Rendering : visualizza la pagina successiva per una visualizzazione veloce / fluida
Documentazione
- Quartz PDFObjects (utilizzato per meta info, annotazioni, pollici)
- Abobe PDF Spec
Progetti di esempio
- Apple / ZoomingPDF - zoom,
UIScrollView
,CATiledLayer
- VFR / lettore - lo zoom, il paging,
UIScrollView
,CATiledView
- sopracciglia / foglie - cercapersone con belle transizioni
- / skim - tutto ciò che sembra (lettore / editor di PDF per OSX)
PSPDFKit
, non è economica, ma vale la pena: pspdfkit.com