Recentemente, houve muitas perguntas sobre o desenho de PDFs.
Sim, você pode renderizar PDFs com muita facilidade, UIWebView
mas isso não pode fornecer o desempenho e a funcionalidade que você esperaria de um bom visualizador de PDF.
Você pode desenhar uma página PDF em um CALayer ou em um UIImage . A Apple ainda possui um código de exemplo para mostrar como desenhar um PDF grande em uma visualização de rolagem Zoomable UIS
Mas os mesmos problemas continuam surgindo.
Método UIImage:
- PDFs em uma
UIImage
escala não óptica, assim como em uma abordagem de camada. - A CPU e a memória atingem a geração
UIImages
dePDFcontext
limites / evitam seu uso para criar uma renderização em tempo real de novos níveis de zoom.
Método CATiledLayer:
- Há uma sobrecarga significativa (tempo) atraindo uma página PDF completa para
CALayer
: blocos individuais podem ser vistos renderizando (mesmo com um ajuste tileSize) CALayers
não pode ser preparado com antecedência (exibido fora da tela).
Geralmente, os visualizadores de PDF também consomem muita memória. Monitore até o uso da memória do exemplo PDF com zoom da apple.
No meu projeto atual, estou desenvolvendo um visualizador de PDF e renderizando uma UIImage
de uma página em um thread separado (também problemas aqui!) E apresentando-a enquanto a escala é x1. CATiledLayer
a renderização entra em ação quando a escala é> 1. O iBooks adota uma abordagem semelhante, como se você rolar as páginas, poderá ver uma versão mais baixa da página por menos de um segundo antes de aparecer uma versão nítida.
Estou renderizando 2 páginas de cada lado da página em foco, para que a imagem PDF esteja pronta para mascarar a camada antes de começar a desenhar. As páginas são destruídas novamente quando estão a +2 páginas da página em foco.
Alguém tem alguma ideia, não importa quão pequena ou óbvia seja para melhorar o desempenho / manipulação de memória dos PDFs de desenho? ou quaisquer outros problemas discutidos aqui?
EDIT: Algumas dicas (Crédito: Luke Mcneice, VdesmedT, Matt Gallagher, Johann):
Salve qualquer mídia em disco quando puder.
Use tileSizes maiores se renderizar em TiledLayers
init matrizes freqüentemente usadas com objetos de espaço reservado, alternativamente outra abordagem de design é essa
Observe que as imagens renderizam mais rápido que um
CGPDFPageRef
Use
NSOperations
ou GCD & Blocks para preparar as páginas antes do tempo.ligue
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
antesCGContextDrawPDFPage
para reduzir o uso de memória enquanto desenhainiciar o seu
NSOperations
com um docRef é uma má idéia (memória), envolva o docRef em um singleton.Cancelar desnecessariamente
NSOperations
Quando você puder, especialmente se eles estiverem usando memória, tenha cuidado ao deixar os contextos abertos!Recicle objetos de página e destrua visualizações não utilizadas
Feche todos os contextos abertos assim que não precisar deles
ao receber avisos de memória, libere e recarregue o DocRef e qualquer cache de página
Outros recursos de PDF:
Obtendo links dentro de um PDF (e aqui e aqui )
Obtendo o destino do link (Obtendo o número da página da
/Dest
matriz)
Obtendo texto bruto (e aqui e aqui e aqui (posicionamento focado))
Pesquisando (e aqui ) (não funciona com todos os PDFs (alguns mostram apenas caracteres estranhos, acho que é um problema de codificação, mas não tenho certeza) -Credit BrainFeeder)
CALayer e renderização fora da tela - renderize a próxima página para uma exibição rápida / suave
Documentação
- Objetos PDF de quartzo (usado para informações meta, anotações, polegares)
- Abobe PDF Spec
Projetos de exemplo
- Apple / ZoomingPDF - zoom,
UIScrollView
,CATiledLayer
- VFR / leitor - zoom, paginação,
UIScrollView
,CATiledView
- sobrancelha / folhas - paginação com boas transições
- / skim - tudo o que parece (leitor / editor de PDF para OSX)
PSPDFKit
, não é barato, mas vale a pena: pspdfkit.com