2016-05-04 21 views
5

Voglio creare pdf nella directory dei documenti e voglio dare i numeri di pagina quindi ho bisogno dell'oggetto CGPDFDocumentRef.Crash whille Conversione da NSURL a CFURL

let fileName: NSString = "test.pdf" 

let path:NSArray = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 

let documentDirectory: AnyObject = path.objectAtIndex(0) 

let pdfPathWithFileName = documentDirectory.stringByAppendingPathComponent(fileName as String) 

UIGraphicsBeginPDFContextToFile(pdfPathWithFileName as String, CGRectZero, nil) 

let ref : CGContextRef = UIGraphicsGetCurrentContext()! 

let localUrl = NSURL.fileURLWithPath(pdfPathWithFileName) 

Ho percorso file convertito in url ma questa riga in basso genera un arresto anomalo e non so perché ..?

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

Avete qualche uscita dallo schianto? Inoltre, prova ad estrarre 'localUrl come CFURLRef' su una riga separata e vedi se questo è' nil' per caso, immagino che questo sia il tuo problema. – pbodsk

+0

@pbodsk: Sì, restituisce zero e non so perché ..? questa riga restituisce CGPDFDocumentCreateWithURL (localUrl come CFURLRef)! nil. Sebbene localUrl abbia un percorso file. –

+0

In Swift, non è necessario nominare esplicitamente il tipo di una variabile se Swift può inferire il tipo. Ad esempio, 'let path: NSArray = NSSearchPathForDirectoriesInDomains (.DocumentDirectory, .UserDomainMask, true)' può essere facilmente rappresentato come 'let path = NSSearchPathForDirectoriesInDomains (.DocumentDirectory, .UserDomainMask, true)', con il bonus aggiuntivo di Swift conoscendo i tipi usato dall'array è un 'String'. – MaddTheSane

risposta

0

È perché il tuo test.pdf non è presente nella cartella della directory del documento.

+0

No, ho già provato. Test.pdf viene creato ogni volta che eseguo l'app. –

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

Non si blocca con il tuo codice ma pdfDocumentRef restituisce nil. –

+0

Mostraci il registro degli arresti anomali. –

+0

Ora dovrebbe funzionare, se NSURL non riesce a convertire, prova a convertire la stringa precedente. –

0

così sembra la vostra parte NSURL(fileURLWithPath: pdfPathWithFileName) as CFURLRef non riesce e questo è ciò che sta causando i problemi.

Ho appena trovato questo nella documentation about CFURL

CFURL non riesce a creare un oggetto se la stringa passata non è ben formato (vale a dire, se non è conforme RFC 2396). Esempi di casi che non avranno esito positivo sono stringhe contenenti caratteri spaziali e caratteri high-bit. Se una funzione non riesce a creare un oggetto CFURL, restituisce NULL, che devi essere pronto a gestire. Se si creano oggetti CFURL utilizzando i percorsi del file system, è necessario utilizzare le funzioni CFURLCreateFromFileSystemRepresentation e CFURLCreateFromFileSystemRepresentationRelativeToBase, che gestiscono le sottili differenze tra i percorsi degli URL e i percorsi del file system.

E this question sembra essere lo stesso problema. Come suggerisce one of the answers:

È necessario il convertito NSString a CFStringRef quindi chiamare CFURLCreateWithFileSystemPath;

La speranza che ti aiuta.

+0

Come puoi vedere nel mio codice ho già utilizzato fileUrlWithPath. –

+0

e qual è il valore di 'localUrl', quindi? – 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 –