Search code examples
objective-cxcodepdfcore-graphics

CGPDFDocumentCreateWithURL fails (Toll-Free bridging of NSURL to CFURLRef)


I've got the following function:

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

    _pdfDocument = CGPDFDocumentCreateWithURL((CFURLRef)pathUrl);
}

Which from the documentation I'm lead to believe will work because you can case from an NSURL* to a CFURLRef via Toll-Free Bridging. However, this function fails, and I get the following output in the log:

CFURLCreateDataAndPropertiesFromResource: error code -15.

NB: -15 = kCFURLImproperArgumentsError

However, if I create an actual CFURLRef, it works absolutely fine:

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

What am I missing? I'm happy to keep the second function in my code, but I'd rather know why the first one is failing.


Solution

  • To convert a file system path to a URL, use

    NSURL *pathUrl = [NSURL fileURLWithPath:path];
    

    URLWithString expects a RFC 2396 conforming URL string like "http://..." or "file:///...", including the "scheme" etc.

    Added: Actually NSURL *pathUrl = [NSURL URLWithString:path]; returns a valid object, so it seems to work, but reading from this URL (e.g. dataWithContentsOfURL) fails.