【问题标题】:CGPDFDocumentCreateWithURL fails (Toll-Free bridging of NSURL to CFURLRef)CGPDFDocumentCreateWithURL 失败(NSURL 到 CFURLRef 的免费桥接)
【发布时间】:2013-04-06 09:17:01
【问题描述】:

我有以下功能:

- (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)
}

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

【问题讨论】:

    标签: objective-c xcode pdf core-graphics


    【解决方案1】:

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

    NSURL *pathUrl = [NSURL fileURLWithPath:path];
    

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

    补充:实际上NSURL *pathUrl = [NSURL URLWithString:path];返回一个有效的对象,所以它似乎工作,但是从这个URL读取(例如@987654324 @) 失败。

    【讨论】:

    • +1。如果 path 在 URL 中包含无效字符(例如空格),它甚至不会总是有效。
    【解决方案2】:

    您需要将 NSString 转换为 CFStringRef 然后调用 CFURLCreateWithFileSystemPath;

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2010-10-22
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多