为了账号安全,请及时绑定邮箱和手机立即绑定

使用Quartz在iOS上获取PDF超链接

使用Quartz在iOS上获取PDF超链接

喵喵时光机 2019-10-24 11:21:12
我整天都在尝试从iPad应用程序中的PDF获取超链接元数据。CGPDF * API真是一场噩梦,我在网上找到的关于这一切的唯一信息是我必须寻找“ Annots”字典,但我在PDF中找不到它。我什至使用旧的Voyeur Xcode样本来检查我的测试PDF文件,但没有找到该“ Annots”字典的痕迹...要知道,这是一个功能,我在每一个PDF阅读器看-这个同样的问题已经被 问 多 时间在这里没有真正的实际的答案。我通常从不直接请求示例代码,但是显然这次我真的很需要……有人可以使用示例代码来工作吗?更新:我刚刚意识到,完成我的PDF测试的那个人只是将URL插入为文本,而不是真正的注释。他尝试添加注释,我的代码现在可以正常工作...但这不是我所需要的,因此看来我必须分析文本并搜索URL。但这是另一个故事...更新2:所以我终于想出了一些有效的代码。我将其发布在这里,希望对您有所帮助。假定PDF文档实际上包含注释。for(int i=0; i<pageCount; i++) {    CGPDFPageRef page = CGPDFDocumentGetPage(doc, i+1);    CGPDFDictionaryRef pageDictionary = CGPDFPageGetDictionary(page);    CGPDFArrayRef outputArray;    if(!CGPDFDictionaryGetArray(pageDictionary, "Annots", &outputArray)) {        return;    }    int arrayCount = CGPDFArrayGetCount( outputArray );    if(!arrayCount) {        continue;    }    for( int j = 0; j < arrayCount; ++j ) {        CGPDFObjectRef aDictObj;        if(!CGPDFArrayGetObject(outputArray, j, &aDictObj)) {            return;        }        CGPDFDictionaryRef annotDict;        if(!CGPDFObjectGetValue(aDictObj, kCGPDFObjectTypeDictionary, &annotDict)) {            return;        }        CGPDFDictionaryRef aDict;        if(!CGPDFDictionaryGetDictionary(annotDict, "A", &aDict)) {            return;        }        CGPDFStringRef uriStringRef;        if(!CGPDFDictionaryGetString(aDict, "URI", &uriStringRef)) {            return;        }        CGPDFArrayRef rectArray;        if(!CGPDFDictionaryGetArray(annotDict, "Rect", &rectArray)) {            return;        }        int arrayCount = CGPDFArrayGetCount( rectArray );        CGPDFReal coords[4];        for( int k = 0; k < arrayCount; ++k ) {            CGPDFObjectRef rectObj;            if(!CGPDFArrayGetObject(rectArray, k, &rectObj)) {                return;            }            CGPDFReal coord;            if(!CGPDFObjectGetValue(rectObj, kCGPDFObjectTypeReal, &coord)) {                return;            }            coords[k] = coord;        }               
查看完整描述

3 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

这是获取至少每页注释CGPDFDictionary的基本思想。之后,您应该可以在Adobe的PDF规范的帮助下找到答案。

1.)获取CGPDFDocumentRef。

2.)获取每个页面。

3)在每个页面上,使用CGPDFDictionaryGetArray(pageDictionary, "Annots", &outputArray)pageDictionary是表示CGPDFPage的CGPDFDictionary,而outputArray是存储该页面的Annots数组的变量(CGPDFArrayRef)。


查看完整回答
反对 回复 2019-10-24
?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

我一定很困惑,因为如果我使用以下命令,这一切都会起作用:


CGRect rect = CGRectMake(coords[0],coords[1],coords[2]-coords[0]+1,coords[3]-coords[1]+1);

也许以后我会滥用吗?PDF提供了角落,而CGRect需要一个角落和一个大小。


查看完整回答
反对 回复 2019-10-24
  • 3 回答
  • 0 关注
  • 600 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信