In letzter Zeit gab es viele Fragen zum Zeichnen von PDFs.
Ja, Sie können PDFs sehr einfach mit a rendern, UIWebView
aber dies kann nicht die Leistung und Funktionalität bieten, die Sie von einem guten PDF-Viewer erwarten würden.
Sie können eine PDF-Seite in einen CALayer oder in ein UIImage zeichnen . Apple verfügt sogar über einen Beispielcode, der zeigt, wie große PDF- Dateien in einer zoombaren UIScrollview gezeichnet werden
Aber die gleichen Probleme tauchen immer wieder auf.
UIImage-Methode:
- PDFs in einem
UIImage
nicht optisch skalierbaren sowie einem Layer-Ansatz. - Die CPU und der Arbeitsspeicher treffen beim Generieren
UIImages
aus einemPDFcontext
Grenzwert / verhindern, dass ein Echtzeit-Rendering mit neuen Zoomstufen erstellt wird.
CATiledLayer-Methode:
- Es gibt einen erheblichen Overhead (Zeit) beim Zeichnen einer vollständigen PDF-Seite auf a
CALayer
: Einzelne Kacheln können beim Rendern angezeigt werden (selbst bei einer TileSize-Optimierung). CALayers
kann nicht im Voraus vorbereitet werden (außerhalb des Bildschirms gerendert).
Im Allgemeinen sind PDF-Viewer auch ziemlich speicherintensiv. Überwachen Sie sogar die Speichernutzung des zoombaren PDF-Beispiels von Apple.
In meinem aktuellen Projekt entwickle ich einen PDF-Viewer und rendere eine UIImage
Seite in einem separaten Thread (Probleme auch hier!) Und präsentiere sie, während der Maßstab x1 ist. CATiledLayer
Das Rendern wird gestartet, sobald die Skala> 1 ist. iBooks verfolgt einen ähnlichen Double-Take-Ansatz, als würden Sie beim Blättern durch die Seiten eine Version der Seite mit niedrigerer Auflösung für weniger als eine Sekunde sehen, bevor eine gestochen scharfe Version angezeigt wird.
Ich rendere 2 Seiten auf jeder Seite der Seite im Fokus, so dass das PDF-Bild bereit ist, die Ebene zu maskieren, bevor es mit dem Zeichnen beginnt. Seiten werden wieder zerstört, wenn sie +2 Seiten von der fokussierten Seite entfernt sind.
Hat jemand irgendwelche Erkenntnisse, egal wie klein oder offensichtlich, um die Leistung / Speicherhandhabung von Zeichnungs-PDFs zu verbessern? oder andere hier diskutierte Themen?
EDIT: Einige Tipps (Credit-Luke Mcneice, VdesmedT, Matt Gallagher, Johann):
Speichern Sie alle Medien auf der Festplatte, wenn Sie können.
Verwenden Sie beim Rendern auf TiledLayers größere tileSizes
Init verwendet häufig verwendete Arrays mit Platzhalterobjekten. Alternativ ist dies auch ein anderer Entwurfsansatz
Beachten Sie, dass Bilder schneller als a gerendert werden
CGPDFPageRef
Verwenden Sie
NSOperations
oder GCD & Blocks , um Seiten im Voraus vorzubereiten.Rufen Sie
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
vorherCGContextDrawPDFPage
auf, um die Speichernutzung beim Zeichnen zu reduzierenDas Initiieren
NSOperations
mit einem docRef ist eine schlechte Idee (Speicher). Wickeln Sie das docRef in einen Singleton.Unnötig abbrechen
NSOperations
Wenn Sie können, insbesondere wenn sie Speicher verwenden, sollten Sie jedoch darauf achten, dass die Kontexte nicht offen bleiben!Bereiten Sie Seitenobjekte auf und zerstören Sie nicht verwendete Ansichten
Schließen Sie alle offenen Kontexte, sobald Sie sie nicht benötigen
Wenn Sie Speicherwarnungen erhalten, geben Sie DocRef und alle Seiten-Caches frei und laden Sie sie neu
Weitere PDF-Funktionen:
Links in ein PDF einfügen (und hier und hier )
Abrufen des Ziels des Links (Abrufen der Seitenzahl aus dem
/Dest
Array)
Abrufen von Rohtext (und hier und hier und hier (Positionierung fokussiert))
Suchen (und hier ) (funktioniert nicht mit allen PDFs (einige zeigen nur seltsame Zeichen, ich denke, es ist ein Codierungsproblem, aber ich bin nicht sicher) -Credit BrainFeeder)
CALayer- und Off-Screen-Rendering - Rendern Sie die nächste Seite für eine schnelle / reibungslose Anzeige
Dokumentation
- Quartz PDFObjects (Wird für Metainfos, Anmerkungen, Daumen verwendet)
- Abobe PDF Spec
Beispielprojekte
- Apple / ZoomingPDF - Zoomen
UIScrollView
,CATiledLayer
- vfr / reader - Zoomen, Blättern
UIScrollView
,CATiledView
- Stirn / Blätter - Blättern mit schönen Übergängen
- / skim - alles wie es scheint (PDF Reader / Editor für OSX)
PSPDFKit
, die nicht billig ist, aber den Wert: pspdfkit.comAntworten:
Ich habe eine solche Anwendung mit ungefähr demselben Ansatz erstellt, außer:
UIImage
sondern zeichne stattdessen das Bild in der Ebene, wenn das Zoomen 1 ist. Diese Kacheln werden automatisch freigegeben, wenn Speicherwarnungen ausgegeben werden.Immer wenn der Benutzer mit dem Zoomen beginnt, erhalte ich das
CGPDFPage
und rendere es mit dem entsprechenden CTM. Der Code in- (void)drawLayer: (CALayer*)layer inContext: (CGContextRef) context
ist wie folgt:Problem ist das Objekt, das das enthält
CGPDFDocumentRef
. Ich synchronisiere den Teil, auf den ich auf diepdfDoc
Eigenschaft zugreife, weil ich sie freigebe und beim Empfang von memoryWarnings neu erstelle. Es scheint, dass dasCGPDFDocumentRef
Objekt ein internes Caching durchführt, das ich nicht loswerden konnte.quelle
Für einen einfachen und effektiven PDF-Viewer können Sie jetzt (iOS 4.0+) das QuickLook-Framework verwenden, wenn Sie nur eingeschränkte Funktionen benötigen:
Zuerst müssen Sie gegen
QuickLook.framework
und verlinken#import <QuickLook/QuickLook.h>;
Anschließend in einer
viewDidLoad
oder einer der faulen Initialisierungsmethoden:quelle
Seit iOS 11 können Sie das native Framework PDFKit zum Anzeigen und Bearbeiten von PDFs verwenden.
Nach dem Import von PDFKit sollten Sie a
PDFView
mit einer lokalen oder einer Remote-URL initialisieren und in Ihrer Ansicht anzeigen.Weitere Informationen zu PDFKit finden Sie in der Apple Developer-Dokumentation.
quelle
quelle