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.com