2013-04-06 48 views
0

我有以下功能:CGPDFDocumentCreateWithURL失敗(NSURL的免費電話橋接至CFURLRef)

- (void)loadPdfFromPath:(NSString*)path 
{ 
    NSURL *pathUrl = [NSURL URLWithString:path]; 

    _pdfDocument = CGPDFDocumentCreateWithURL((CFURLRef)pathUrl); 
} 

從文檔我帶領相信會工作,因爲你可以從一個NSURL*來區分a CFURLRef via Toll-Free Bridging。但是,此功能失敗,我得到的日誌中下面的輸出:

CFURLCreateDataAndPropertiesFromResource:錯誤代碼-15。

NB:-15 = kCFURLImproperArgumentsError

但是,如果我創建一個實際CFURLRef,它工作絕對沒問題:

- (void)loadPdfFromPath:(NSString*)path 
{ 
    CGPDFDocumentRelease(_pdfDocument); 

    CFStringRef cgPath = CFStringCreateWithCString(NULL, [path UTF8String], kCFStringEncodingUTF8); 

    CFURLRef url = CFURLCreateWithFileSystemPath(NULL, cgPath, kCFURLPOSIXPathStyle, 0); 

    _pdfDocument = CGPDFDocumentCreateWithURL(url); 

    CFRelease(url); 
    CFRelease(cgPath) 
} 

我缺少什麼?我很高興在代碼中保留第二個函數,但我更想知道第一個函數失敗的原因。

回答

5

的文件系統路徑轉換爲URL,使用

NSURL *pathUrl = [NSURL fileURLWithPath:path]; 

URLWithString需要一個RFC 2396符合URL字符串例如 「http:// ...」 或「文件:/// ... 」,包括‘方案’等

補充:其實NSURL *pathUrl = [NSURL URLWithString:path];返回一個有效的對象,因此它似乎工作,但這個網址讀取(如dataWithContentsOfURL)失敗。

+0

+1。它不會總是甚至似乎工作,如果'path'有一個URL是無效字符,如空格。 – 2013-04-06 14:33:45

+0

@KenThomases:好的,謝謝你的反饋! – 2013-04-06 14:36:20

2

你需要轉換的NSString CFStringRef然後調用CFURLCreateWithFileSystemPath;

CFStringRef aCFString = (__bridge CFStringRef)path; 
CFURLRef url = CFURLCreateWithFileSystemPath (NULL, aCFString, kCFURLPOSIXPathStyle, 0); 
NSLog(@"NSURL %@",url);