Il y a eu récemment de nombreuses questions sur le dessin de PDF.
Oui, vous pouvez rendre le PDF très facilement avec un UIWebView
mais cela ne peut pas donner les performances et les fonctionnalités que vous attendez d'un bon visualiseur PDF.
Vous pouvez dessiner une page PDF sur un CALayer ou sur un UIImage . Apple a même un exemple de code pour montrer comment dessiner un grand PDF dans un UIScrollview zoomable
Mais les mêmes problèmes continuent d'apparaître.
Méthode UIImage:
- Les PDF
UIImage
ne sont pas à l'échelle optique ainsi qu'une approche par calque. - Le processeur et la mémoire ont frappé sur la génération de la à
UIImages
partir d' unePDFcontext
limite / empêche de l' utiliser pour créer en temps réel rendent de nouveaux niveaux de zoom.
Méthode CATiledLayer:
- Il y a un temps système important (temps) pour dessiner une page PDF complète sur un
CALayer
: les tuiles individuelles peuvent être vues en rendu (même avec un ajustement de la taille des tuiles) CALayers
ne peut pas être préparé à l'avance (rendu hors écran).
Généralement, les visionneuses PDF sont également assez gourmandes en mémoire. Surveillez même l'utilisation de la mémoire de l'exemple PDF zoomable d'Apple.
Dans mon projet actuel, je développe une visionneuse PDF et je fais le rendu UIImage
d'une page dans un thread séparé (problèmes ici aussi!) Et je la présente alors que l'échelle est x1. CATiledLayer
le rendu entre en jeu une fois que l'échelle est> 1. iBooks adopte une approche à double prise similaire, comme si vous faites défiler les pages, vous pouvez voir une version de résolution inférieure de la page pendant un peu moins d'une seconde avant qu'une version nette n'apparaisse.
Im rendu 2 pages de chaque côté de la page au point afin que l'image PDF soit prête à masquer le calque avant qu'il ne commence à dessiner. Les pages sont détruites à nouveau lorsqu'elles sont à +2 pages de la page focalisée.
Quelqu'un a-t-il des idées, aussi petites ou évidentes pour améliorer les performances / la gestion de la mémoire des dessins PDF? ou d'autres questions discutées ici?
EDIT: Quelques conseils (Crédit - Luke Mcneice, VdesmedT, Matt Gallagher, Johann):
Enregistrez tous les médias sur le disque lorsque vous le pouvez.
Utiliser des tailles de tuile plus grandes si le rendu est sur des tuiles
initialiser des tableaux fréquemment utilisés avec des objets d'espace réservé, alternativement une autre approche de conception est celle-ci
Notez que les images seront rendues plus rapidement qu'un
CGPDFPageRef
Utilisez
NSOperations
ou GCD & Blocks pour préparer les pages à l'avance.appeler
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
avantCGContextDrawPDFPage
pour réduire l'utilisation de la mémoire lors du dessininitier votre
NSOperations
avec un docRef est une mauvaise idée (mémoire), enveloppez le docRef dans un singleton.Annuler inutilement
NSOperations
Lorsque vous le pouvez, surtout s'ils utilisent de la mémoire, faites attention à ne pas laisser les contextes ouverts!Recyclez les objets de page et détruisez les vues inutilisées
Fermez tous les contextes ouverts dès que vous n'en avez pas besoin
à la réception des avertissements de mémoire, relâchez et rechargez le DocRef et les caches de page
Autres fonctionnalités PDF:
Obtention de liens dans un PDF (et ici et ici )
Obtention de la cible du lien (obtention du numéro de page à partir du
/Dest
tableau)
Obtenir du texte brut (et ici et ici et ici (positionnement ciblé))
Recherche (et ici ) (ne fonctionne pas avec tous les PDF (certains montrent juste des caractères étranges, je suppose que c'est un problème d'encodage mais je ne suis pas sûr) -Credit BrainFeeder)
CALayer et rendu hors écran - rendre la page suivante pour un affichage rapide / fluide
Documentation
- Quartz PDFObjects (utilisé pour les méta-informations, les annotations, les pouces)
- Spécifications PDF Abobe
Exemples de projets
- Apple / ZoomingPDF - zoom,
UIScrollView
,CATiledLayer
- vfr / lecteur - zoom, recherche de personnes,
UIScrollView
,CATiledView
- front / feuilles - pagination avec de belles transitions
- / skim - tout ce qu'il semble (lecteur / éditeur PDF pour OSX)
PSPDFKit
, elle n'est pas bon marché, mais vaut: pspdfkit.com