在这问题的基础上,我尝试深入研究CGPDF,以获得PDF大小的数据,而不将其加载到内存中。
iOS的这一部分文档非常贫乏,搜索web只会给我一些关于编写pdfs的糟糕结果。下面是我尝试过的内容,这不会导致除了指定行上的EXC_BAD_ACCESS之外的其他任何东西。
NSURL *imageFileURL = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"a1" ofType:@"pdf"]];
CGPDFDocumentRef pdfSource = CGPDFDocumentCreateWithURL((__bridge CFURLRef)imageFileURL);
CGPDFDictionaryRef pdfProps = CGPDFDocumentGetInfo(pdfSource);
CGPDFStringRef cfValue;
CGPDFDictionaryGetString(pdfProps, kCGPDFMediaBox, &cfValue); //Crash, EXC_BAD_ACCESS
NSString *value = CFBridgingRelease(CGPDFStringCopyTextString(cfValue));
CGRect rect = CGRectFromString(value);
NSLog(@"#rekt: %@",NSStringFromCGRect(rect));我在哪里搞错了?
发布于 2014-04-11 13:15:47
CGPDFDocumentGetInfo()字典不包含有关大小的信息,因为PDF文档中的所有页面都可能有不同的维度(媒体框、裁剪框、.)。以下说明如何获取第一页的信息:
CGPDFDocumentRef doc = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfURL);
CGPDFPageRef page = CGPDFDocumentGetPage(doc, 1);
CGRect mediaBox = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
NSLog(@"#mediaBox: %@",NSStringFromCGRect(mediaBox));
CGPDFDocumentRelease(doc);对于具有多个页面的文档,您必须确定文档中所有页面的最大值。
发布于 2014-04-11 13:15:54
您将错误的键值传递给CGPDFDictionaryGetString,键是const char *,而您传递的是kCGPDFMediaBox,这是枚举CGPDFBox (定义为0)的常量。正如文档所述,CGPDFDictionaryRef键是通过使用strcmp进行比较的,因此将0(或NULL)作为键传递将导致strcmp崩溃。
如果要使用PDF页面的媒体框,请使用CGPDFPageGetBoxRect
NSLog(@"#rekt: %@",NSStringFromCGRect(CGPDFPageGetBoxRect(aPDFPage, kCGPDFMediaBox));https://stackoverflow.com/questions/23012904
复制相似问题