Apple liefert eine ganze Reihe von Methoden auf der Ebene CoreGraphics
zum Zeichnen von PDF-Inhalten direkt. Soweit mir bekannt ist, ist nichts davon ordentlich verpackt auf der Ebene UIKit
, so dass es zu diesem Zeitpunkt möglicherweise nicht gut zu Ihrem Projekt passt, besonders wenn Sie auf der C-Ebene nicht so komfortabel sind. Die relevante Funktion ist jedoch CGContextDrawPDFPage;
für die normale CoreGraphics
Art der Dinge gibt es andere Methoden, um eine PDF-Referenz aus einer Datenquelle zu erstellen und dann eine Seitenreferenz aus einer PDF zu erhalten. Sie müssen sich dann mit der Skalierung und der Übersetzung in die gewünschte Ansicht befassen und darauf hingewiesen werden, dass Sie eine horizontale Spiegelung durchführen müssen, da PDFs (und OS X) die untere linke Ecke als Ursprung und iOS die obere linke Ecke verwenden . Beispielcode, weg von der Oberseite meines Kopfes:
UIGraphicsBeginImageContext(thumbnailSize);
CGPDFDocumentRef pdfRef = CGPDFDocumentCreateWithProvider((CGDataProviderRef)instanceOfNSDataWithPDFInside);
CGPDFPageRef pageRef = CGPDFDocumentGetPage(pdfRef, 1); // get the first page
CGContextRef contextRef = UIGraphicsGetCurrentContext();
// ignore issues of transforming here; depends on exactly what you want and
// involves a whole bunch of normal CoreGraphics stuff that is nothing to do
// with PDFs
CGContextDrawPDFPage(contextRef, pageRef);
UIImage *imageToReturn = UIGraphicsGetImageFromCurrentImageContext();
// clean up
UIGraphicsEndImageContext();
CGPDFDocumentRelease(pdfRef);
return imageToReturn;
Bei einer Vermutung, werden Sie wahrscheinlich wollen CGPDFPageGetBoxRect(pageRef, kCGPDFCropBox)
verwenden, um die Zuschneiderahmen Seite und dann herausfinden, wie die Skalierung/bewegen Sie die Bildgröße zu passen .
Wahrscheinlich einfacher für Ihre Zwecke sind die -renderInContext:
Methode auf CALayer
(siehe QA 1703) - die alten Mittel ein Screenshot UIGetScreenImage
war immer, aber das war nie wirklich offizielle API und scheinbar vorübergehend nur wegen der versehentlichen Genehmigung von RedLaser durfte . Mit dem Code in der QA können Sie sich einrichten, um ein UIImage von jeder anderen Ansicht zu erhalten, ohne dass diese Ansicht auf dem Bildschirm angezeigt werden muss. Welche löst möglicherweise etwas von Ihrem Problem mit der Bildschirmaufnahme? Obwohl das bedeutet, dass Sie nur OS 4.x unterstützen können.
In beiden Fällen zeichnen PDFs nicht so schnell. Wahrscheinlich müssen Sie die Tabelle auffüllen und dann die Miniaturbilder auf einen Hintergrundfaden zeichnen und nach oben schieben, wenn sie verfügbar sind. Sie können UIKit-Objekte nicht wirklich sicher auf Hintergrund-Threads verwenden, aber alle CoreGraphics
-Dateien sind sicher.
Hallo alones verwende ich Code PDF-Miniaturen zu bekommen. Es scheint, als ob die CGContextConcatCTM (context, pdfTransform) Zeile einen Speicherengpass erzeugt. Ich habe herausgefunden, dass es OK ist, wenn ich diese Zeile verlasse. Aber ich kann es nicht auslassen, weil ich das für ein richtiges Thumbnail brauche. Hast du eine Idee, wie wir das verbessern können? Thx btw ... – aslisabanci
dieser funktioniert für mich ... der eine über ich weiß nicht warum, aber es erzeugt einen Dummy oder Müll thumbnail ... danke ... – Underdog
docs sagen UIGraphicsGetImageFromCurrentImageContext() ist nicht thread sicher –