【问题标题】:CGPDFDictionaryGetString getting dimensions of PDF issuesCG PDFDictionary GetString 获取 PDF 问题的维度
【发布时间】:2014-04-11 12:43:46
【问题描述】:

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

我在哪里走错了?

【问题讨论】:

  • 如果您小心使用不同的功能,该文档还不错,但您需要阅读(至少部分)Adobe 的 PDF 规范以及其中定义的规则对于PDF是。没有它们,开始使用 PDF 字典和其他结构几乎是没用的......
  • @DavidvanDriessche 可能只是我的错,是的。无论如何,我都不是这方面的专家。只是把这当作学校以外的爱好。
  • 不是评判,奥斯卡,只是分享我的一个艰难的教训 :) 爱好很棒 - 坚持下去。

标签: ios objective-c pdf cgpdf


【解决方案1】:

CGPDFDocumentGetInfo() 字典不包含有关大小的信息,因为 PDF 文档中的所有页面都可以有不同的尺寸(媒体框、裁剪框等)。 下面展示了如何获取第一页的信息:

CGPDFDocumentRef doc = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfURL);
CGPDFPageRef page = CGPDFDocumentGetPage(doc, 1);
CGRect mediaBox = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
NSLog(@"#mediaBox: %@",NSStringFromCGRect(mediaBox));
CGPDFDocumentRelease(doc);

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

【讨论】:

  • 当心 - 你所说的并不完全正确。您提供的代码应该可以工作(因为我希望 CGPDFPageGetBoxRect 函数能够正确实现),但是 Mediabox(和许多其他属性)可以在单个页面上设置,也可以由页面中更高容器的页面继承树。
  • 谢谢,这对我有用。 @DavidvanDriessche,PDF 只有一页,所以很好。我在这个教育应用程序中为一些公式使用矢量图像。
  • @DavidvanDriessche:您说得对,在 PDF 文件格式中,MediaBox 可以是 /Page 对象或父 /Pages 对象的一部分。从 CGPDF... API 的角度来看,它是页面的属性,因为该 API 无法直接访问各个对象(我认为)。我已经更新了答案,以使其(希望)在技术上正确。是的,CGPDFPageGetBoxRect() 在适当的地方从父对象返回信息。 - 感谢您的反馈!
【解决方案2】:

您将错误的键值传递给CGPDFDictionaryGetString,键是const char *,而您传递的kCGPDFMediaBoxenum CGPDFBox 的常量(定义为0)。 正如文档所说,CGPDFDictionaryRef 键是通过使用 strcmp 进行比较的,因此将 0(或 NULL)作为键传递将导致 strcmp 崩溃。

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

NSLog(@"#rekt: %@",NSStringFromCGRect(CGPDFPageGetBoxRect(aPDFPage, kCGPDFMediaBox));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    相关资源
    最近更新 更多