2016-05-04 11 views
5

Ich möchte PDF in Dokumentverzeichnis erstellen und Seitenzahlen geben, so brauche ich CGPDFDocumentRef Objekt.Crash Whille Konvertieren von NSURL in CFURL

Ich habe Dateipfad in URL konvertiert, aber diese unter Linie erzeugt einen Absturz und ich weiß nicht warum ...?

let pdfDocumentRef: CGPDFDocumentRef = CGPDFDocumentCreateWithURL(localUrl as CFURLRef)! 
+0

Haben Sie eine Ausgabe von dem Absturz? Versuchen Sie auch, die 'localUrl als CFURLRef' in eine separate Zeile zu extrahieren, um zu sehen, ob das" nil "ist, ich vermute, dass Sie hier ein Problem haben. – pbodsk

+0

@bodsk: Ja, es gibt keine Antwort und ich weiß nicht warum ...? Diese Zeile gibt CGPDFDocumentCreateWithURL (localUrl als CFURLRef) zurück! Null. Obwohl localUrl einen Dateipfad hat. –

+0

In Swift müssen Sie den Typ einer Variablen nicht explizit benennen, wenn Swift den Typ ableiten kann. Zum Beispiel kann 'let path: NSArray = NSSearchPathForDirectoriesInDomains (.DocumentDirectory, .UserDomainMask, true)' leicht als 'let path = NSSearchPathForDirectoriesInDomains (.DocumentDirectory, .UserDomainMask, true)' dargestellt werden, mit dem zusätzlichen Bonus, dass Swift die Typen kennt Vom Array wird ein 'String' verwendet. – MaddTheSane

Antwort

0

Es ist, weil Ihre test.pdf nicht in Dokumentverzeichnisordner vorhanden ist.

+0

Nein das habe ich schon getestet. Test.pdf wird jedes Mal erstellt, wenn ich eine App starte. –

0
let localUrl = pdfPathWithFileName as CFStringRef 
let pdfDocumentRef = CFURLCreateWithFileSystemPath(nil, localUrl, CFURLPathStyle.CFURLPOSIXPathStyle, false) 
let page_count = CGPDFDocumentGetNumberOfPages(pdfDocumentRef) 
+0

Es stürzt nicht mit Ihrem Code ab, aber pdfDocumentRef gibt nil zurück. –

+0

Bitte zeigen Sie uns das Unfallprotokoll. –

+0

Jetzt sollte es funktionieren, wenn NSURL nicht konvertieren, versuchen Sie einfach, die vorherige Zeichenfolge zu konvertieren. –

0

So scheint es, Ihre NSURL(fileURLWithPath: pdfPathWithFileName) as CFURLRef Teil ausfällt, und das ist, was Ihre Probleme verursacht.

Ich finde dies nur in dem documentation about CFURL

CFURL nicht ein Objekt zu erstellen, wenn die Zeichenfolge nicht übergeben wird gut gebildet (das heißt, wenn es mit RFC 2396 nicht entspricht). Beispiele für Fälle, die nicht erfolgreich sind, sind Zeichenfolgen, die Leerzeichen und High-Bit-Zeichen enthalten. Wenn eine Funktion ein CFURL-Objekt nicht erstellen kann, gibt es NULL zurück, auf das Sie vorbereitet sein müssen. Wenn Sie CFURL-Objekte mit Dateisystempfaden erstellen, sollten Sie die Funktionen CFURLCreateFromFileSystemRepresentation und CFURLCreateFromFileSystemRepresentationRelativeToBase verwenden, die die feinen Unterschiede zwischen URL-Pfaden und Dateisystempfaden behandeln.

Und this question scheint etwa das gleiche Problem zu sein. Wie one of the answers vorschlagen:

Sie müssen die Konvertit CFStringRef NSString dann CFURLCreateWithFileSystemPath nennen;

Hoffnung, die Ihnen hilft.

+0

Wie Sie in meinem Code sehen können, habe ich bereits FileUrlWithPath verwendet. –

+0

und was ist dann der Wert von 'localUrl'? – pbodsk

+0

file: ///Users/anil.kukadeja/Library/Developer/CoreSimulator/Devices/AC107F46-79C0-49B6-9773-0BB0672E8902/data/Containers/Data/Application/7BE0B88F-45A0-45BB-B01F-A41F18D7A2FF/Documents/ test.pdf –