簡體   English   中英

CGPDFDocumentCreateWithURL失敗(NSURL與CFURLRef的免費橋接)

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

我有以下功能:

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

    _pdfDocument = CGPDFDocumentCreateWithURL((CFURLRef)pathUrl);
}

我認為可以從文檔中找到哪種方法是可行的,因為您可以通過免費電話橋接NSURL*轉換為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)
}

我想念什么? 我很高興將第二個函數保留在代碼中,但我想知道為什么第一個函數會失敗。

要將文件系統路徑轉換為URL,請使用

NSURL *pathUrl = [NSURL fileURLWithPath:path];

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

補充:實際上NSURL *pathUrl = [NSURL URLWithString:path]; 返回一個有效的對象,因此它似乎可以工作 ,但是從此URL(例如dataWithContentsOfURL )讀取失敗。

您需要將NSString轉換為CFStringRef,然后調用CFURLCreateWithFileSystemPath;。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM