gpt4 book ai didi

iphone - 如何从pdf文件中的FileAttachment Annotation获取EmbeddedFiles

转载 作者:搜寻专家 更新时间:2023-10-30 20:18:56 25 4
gpt4 key购买 nike

我正在开发 PDF 注释应用程序,我在 iPhone 中添加了 PDF 文件注释,它工作正常,它的注释也可以看到任何读者,但面临一个问题如何从 PDF 文件中的文件附件注释中获取嵌入式文件,该文件是从桌面创建的注释怎么办对于这个问题

我正在使用此代码从文件附件注释中获取注释的内容和位置,它工作正常

 CGPDFDictionaryRef pageDictionary = CGPDFPageGetDictionary(pPage);
// NSLog(@"%@",(NSDictionary*)pageDictionary);
CGPDFArrayRef outputArray;
if(!CGPDFDictionaryGetArray(pageDictionary, "Annots", &outputArray)) {
[pdfAnnots release];
return nil;
}
CGPDFArrayRef rectArray;
if(!CGPDFDictionaryGetArray(annotDict, "Rect", &rectArray)) {
break;
}

int arrayCount = CGPDFArrayGetCount( rectArray );
CGPDFReal coords[4];
for( int k = 0; k < arrayCount; ++k ) {
CGPDFObjectRef rectObj;
if(!CGPDFArrayGetObject(rectArray, k, &rectObj)) {
break;
}

CGPDFReal coord;
if(!CGPDFObjectGetValue(rectObj, kCGPDFObjectTypeReal, &coord)) {
break;
}

coords[k] = coord;
}

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

NSLog(@"%@",NSStringFromCGRect(rect));

CGPDFDictionaryRef aDict;

if(CGPDFDictionaryGetDictionary(annotDict, "AP", &aDict))
{

CGPDFStreamRef textStringRef33;
if(CGPDFDictionaryGetStream(aDict, "N", &textStringRef33)) {



CGPDFDataFormat *format = NULL;

CFDataRef contdata = CGPDFStreamCopyData( textStringRef33, format );

NSData *data=(NSData*)contdata;
}

请帮帮我

提前谢谢你

最佳答案

PDF 嵌入与注释不同。嵌入的文件存储在 document 部分而不是 page 部分。

Annonation 可以包含嵌入文件,但它的提取机制不同。

首先,您应该看到注释对象的内部结构。您可以使用这样的函数:

static void op_Applier(const char *key, CGPDFObjectRef value, void *info) {
if (*(int *)info > 6) {
return;
}
const char *valuestr = NULL;
CGPDFObjectType type = CGPDFObjectGetType(value);
int i = 0;
for (i = 0; i < *(int *)info; i++) {
printf("\t");
}
printf("%s", key);
switch (type) {
case kCGPDFObjectTypeBoolean: {
bool b;
CGPDFObjectGetValue(value, type, &b);
printf(" (boolean) : %s\n", (b)?"true":"false");
}
break;
case kCGPDFObjectTypeInteger: {
int64_t i;
CGPDFObjectGetValue(value, type, &i);
printf(" (integer) : %lld\n", i);
}
break;
case kCGPDFObjectTypeReal: {
CGPDFReal f;
CGPDFObjectGetValue(value, type, &f);
printf(" (real) : %f\n", f);
}
break;
case kCGPDFObjectTypeName:{
CGPDFObjectGetValue(value, type, (void *)&valuestr);
printf(" (name) : %s\n", valuestr);
}
break;
case kCGPDFObjectTypeString: {
CGPDFStringRef str;
CGPDFObjectGetValue(value, type, &str);
printf(" (string) : %s\n", CGPDFStringGetBytePtr(str));
}
break;
case kCGPDFObjectTypeArray: {
printf(" (array)\n");
CGPDFArrayRef arr;
CGPDFObjectGetValue(value, type, &arr);

int t = *(int *)info + 1;
int j;
size_t size = CGPDFArrayGetCount(arr);
for (j = 0; j < size; j ++) {
CGPDFObjectRef obj;
CGPDFArrayGetObject(arr, j, &obj);
char buf[4] = {0};
sprintf(buf, "%d", j);
op_Applier(buf, obj, &t);
}
}
break;
case kCGPDFObjectTypeDictionary: {
printf(" (dictionary)\n");
CGPDFDictionaryRef dict;
CGPDFObjectGetValue(value, type, &dict);
int t = *(int *)info + 1;
CGPDFDictionaryApplyFunction(dict, &op_Applier, &t);
}
break;
case kCGPDFObjectTypeStream:
printf(" (stream)\n");
break;
default:
printf(" (NULL)\n");
break;
}
}

int t = 0; op_Applier("MyDictionary", yourAnnotationDictionary, &t);

其次,您应该找到文件的路径(它将是 stream 对象),然后移动到该对象。这可以通过 CGPDFDictionary 来完成方法。

三、从流中获取NSData,并保存

CGPDFDataFormat format;
CFDataRef data = CGPDFStreamCopyData(stream, &format);

[((__bridge NSData *)data) writeToURL:resultUrl atomically:NO];

CFRelease(data);

附言PDF 注释的 PostScript 语法可以不同。不同的库使用不同的语法,您应该实现所有可能性来制作适用于几乎所有 PDF 文件的应用程序。 sample 可在 this file in vfr Reader 中找到

关于iphone - 如何从pdf文件中的FileAttachment Annotation获取EmbeddedFiles,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18629754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com