如何从PDF使用MuPDF提取嵌入的文件 [英] How to extract embedded files from pdf using MuPDF
本文介绍了如何从PDF使用MuPDF提取嵌入的文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在iOS应用从PDF提取嵌入文件。现在,我尝试使用,使Android应用具有相同的功能 MuPDF 。
My app on iOS extracts embedded files from PDF. Now, i try to make Android app with same functionality using MuPDF.
在iOS上,我可以用Quartz2d提取嵌入的文件:
On iOS, I can use Quartz2d to extract embedded files:
- 访问根PDF字典(
CGPDFDocumentGetCatalog
) - 获取文件阵列(姓名> EmbeddedFiles>姓名),并itarate通过它
- 复制文件流内容
的NSData code>并保存它。
从字典文件(EF> F)
- Access to root PDF dictionary (
CGPDFDocumentGetCatalog
) - Get files array (Names > EmbeddedFiles > Names) and itarate through it
- Copy file stream contents from file dictionary (EF > F) to
NSData
and save it.
有没有办法与MuPDF做到这一点?
Is there any way to do this with MuPDF?
推荐答案
解决方案的基础上,pdfextact.c好像暴力破解,但它的作品:
Solution, based on pdfextact.c seems like bruteforce, but it works:
- itarate通过所有PDF对象(
pdf_load_object
) - 确定对象嵌入文件(
isembed
) - 如果它是 - 获得它的流并保存文件(
saveembed
)
- itarate through all pdf objects (
pdf_load_object
) - determine if object is embedded file (
isembed
) - if it is - access it's stream and save file (
saveembed
)
嵌入式文件,所以,reverce迭代让SENCE。
Embedded files stored at the end of file in most test cases, so, reverce iteration makes sence.
static int isembed(pdf_obj *obj) {
pdf_obj *type = pdf_dict_gets(obj, "Type");
return pdf_is_name(type) && !strcmp(pdf_to_name(type), "Filespec");
}
static void saveembed(pdf_obj *dict) {
char *filename;
pdf_obj *obj = pdf_dict_gets(dict, "F");
if (obj) filename = pdf_to_str_buf(obj);
obj = pdf_dict_gets(dict, "EF");
if (!obj) return;
pdf_obj *stream = pdf_dict_gets(obj, "F");
if (!stream) return;
FILE *f;
fz_buffer *buf;
int n, len;
unsigned char *data;
buf = pdf_load_stream(doc, pdf_to_num(stream), pdf_to_gen(stream));
printf("extracting embedded file %s\n", filename);
f = fopen(filename, "wb");
len = fz_buffer_storage(ctx, buf, &data);
n = fwrite(data, 1, len, f);
fclose(f);
fz_drop_buffer(ctx, buf);
}
这篇关于如何从PDF使用MuPDF提取嵌入的文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文