Recentemente, houve muitas perguntas sobre o desenho de PDFs.
Sim, você pode renderizar PDFs com muita facilidade, UIWebViewmas 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
UIImageescala não óptica, assim como em uma abordagem de camada. - A CPU e a memória atingem a geração
UIImagesdePDFcontextlimites / 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) CALayersnã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 UIImagede uma página em um thread separado (também problemas aqui!) E apresentando-a enquanto a escala é x1. CATiledLayera 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
CGPDFPageRefUse
NSOperationsou GCD & Blocks para preparar as páginas antes do tempo.ligue
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);antesCGContextDrawPDFPagepara reduzir o uso de memória enquanto desenhainiciar o seu
NSOperationscom um docRef é uma má idéia (memória), envolva o docRef em um singleton.Cancelar desnecessariamente
NSOperationsQuando 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
/Destmatriz)
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