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.comRéponses:
J'ai construit ce type d'application en utilisant approximativement la même approche, sauf:
UIImage
mais dessine plutôt l'image dans le calque lorsque le zoom est 1. Ces tuiles seront libérées automatiquement lorsque des avertissements de mémoire seront émis.Chaque fois que l'utilisateur commence à zoomer, j'acquiert le
CGPDFPage
et le rend à l'aide du CTM approprié. Le code en- (void)drawLayer: (CALayer*)layer inContext: (CGContextRef) context
est comme:est l’objet contenant le
CGPDFDocumentRef
. Je synchronise la partie oùpdfDoc
j'accède à la propriété car je la libère et la recrée lors de la réception de memoryWarnings. Il semble que l'CGPDFDocumentRef
objet fasse une mise en cache interne dont je n'ai pas trouvé comment me débarrasser.la source
Pour une visionneuse PDF simple et efficace, lorsque vous n'avez besoin que de fonctionnalités limitées, vous pouvez désormais (iOS 4.0+) utiliser le framework QuickLook:
Tout d'abord, vous devez établir un lien avec
QuickLook.framework
et#import <QuickLook/QuickLook.h>;
Ensuite, dans l'une
viewDidLoad
ou l'autre des méthodes d'initialisation paresseuse:la source
Depuis iOS 11 , vous pouvez utiliser le framework natif appelé PDFKit pour afficher et manipuler des PDF.
Après avoir importé PDFKit, vous devez initialiser un
PDFView
avec une URL locale ou distante et l'afficher dans votre vue.En savoir plus sur PDFKit dans la documentation Apple Developer.
la source
la source