在this问题的基础上,我尝试深入研究CGPDF以获取PDF大小数据,而无需将其加载到内存中。
iOS的这一部分记录很少,在网上搜索只能给我写一些关于写pdf的不好的结果..这是我尝试过的,这不会导致除了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));
我在哪里踩错了?
答案 0 :(得分:0)
CGPDFDocumentGetInfo()
字典不包含有关尺寸的信息,因为
PDF文档中的所有页面可以具有不同的尺寸(媒体框,裁剪框等)。
以下显示了如何获取第一页的信息:
CGPDFDocumentRef doc = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfURL);
CGPDFPageRef page = CGPDFDocumentGetPage(doc, 1);
CGRect mediaBox = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
NSLog(@"#mediaBox: %@",NSStringFromCGRect(mediaBox));
CGPDFDocumentRelease(doc);
对于包含多个页面的文档,您必须确定所有页面的最大值 文件中的页面。
答案 1 :(得分:0)
您将错误的键值传递给CGPDFDictionaryGetString
,键为const char *
,而您传递的kCGPDFMediaBox
是常量enum CGPDFBox(定义为0
)。
正如文档所说,使用CGPDFDictionaryRef
比较strcmp
个密钥,因此将0(或NULL)作为密钥传递将导致strcmp
崩溃。
如果您希望PDF页面的媒体框使用CGPDFPageGetBoxRect
NSLog(@"#rekt: %@",NSStringFromCGRect(CGPDFPageGetBoxRect(aPDFPage, kCGPDFMediaBox));