0

基于这个问题,我试图深入研究 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));

我在哪里走错了?

4

2 回答 2

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

对于具有多页的文档,您必须确定文档中所有页面的最大值。

于 2014-04-11T13:15:47.793 回答
0

您将错误的键值传递给CGPDFDictionaryGetString,键是const char *并且您传递kCGPDFMediaBox的是枚举 CGPDFBox的常量(定义为0)。正如文档所说,CGPDFDictionaryRef键是通过 using 进行比较的strcmp,因此将 0(或 NULL)作为键传递会 crash strcmp

如果您想要 PDF 页面的媒体框,请使用CGPDFPageGetBoxRect

NSLog(@"#rekt: %@",NSStringFromCGRect(CGPDFPageGetBoxRect(aPDFPage, kCGPDFMediaBox));
于 2014-04-11T13:15:54.940 回答