CGPDFDictionaryGetString获取PDF问题的维度

时间:2014-04-11 12:43:46

标签: ios objective-c pdf cgpdf

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));

我在哪里踩错了?

2 个答案:

答案 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));