CGPDFDocumentCreateWithURL失败(NSURL到CFURLRef的免费桥接)

时间:2013-04-06 09:17:02

标签: objective-c xcode pdf core-graphics

我有以下功能:

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

    _pdfDocument = CGPDFDocumentCreateWithURL((CFURLRef)pathUrl);
}

我认为哪些文档可以使用,因为您可以通过Toll-Free BridgingNSURL*CFURLRef。但是,此函数失败,我在日志中得到以下输出:

  

CFURLCreateDataAndPropertiesFromResource:错误代码-15。

注意:-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)
}

我错过了什么?我很高兴在我的代码中保留第二个函数,但我想知道为什么第一个函数失败了。

2 个答案:

答案 0 :(得分:5)

要将文件系统路径转换为URL,请使用

NSURL *pathUrl = [NSURL fileURLWithPath:path];

URLWithString需要符合RFC 2396的URL字符串,如“http:// ...”或“file:/// ...”,包括“方案”等。

已添加: 实际上NSURL *pathUrl = [NSURL URLWithString:path];会返回一个有效的对象,因此似乎可以正常工作,但请从此网址中读取(例如dataWithContentsOfURL)失败。

答案 1 :(得分:2)

You need the convert NSString to CFStringRef then call CFURLCreateWithFileSystemPath;

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