gpt4 book ai didi

android - 如何使用 MuPDF 从 pdf 中提取嵌入文件

转载 作者:行者123 更新时间:2023-11-29 01:57:13 55 4
gpt4 key购买 nike

我在 iOS 上的应用程序从 PDF 中提取嵌入式文件。现在,我尝试使用 MuPDF 制作具有相同功能的 Android 应用程序.

在 iOS 上,我可以使用 Quartz2d 提取嵌入文件:

  1. 访问根 PDF 字典(CGPDFDocumentGetCatalog)
  2. 获取文件数组 (Names > EmbeddedFiles > Names) 并遍历它
  3. 将文件流内容从文件字典 (EF > F) 复制到 NSData 并保存。

有没有办法用 MuPDF 做到这一点?

最佳答案

解决方案,基于 pdfextact.c 看起来像暴力破解,但它有效:

  1. 遍历所有 pdf 对象 (pdf_load_object)
  2. 判断对象是否为嵌入文件(isembed)
  3. 如果是 - 访问它的流并保存文件 (saveembed)

在大多数测试用例中,嵌入文件存储在文件末尾,因此,反向迭代是有意义的。

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

关于android - 如何使用 MuPDF 从 pdf 中提取嵌入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14503948/

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