如何从PDF使用MuPDF提取嵌入的文件 [英] How to extract embedded files from pdf using MuPDF

查看:1103
本文介绍了如何从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:


  1. 访问根PDF字典( CGPDFDocumentGetCatalog

  2. 获取文件阵列(姓名> EmbeddedFiles>姓名),并itarate通过它

  3. 从字典文件(EF> F)
  4. 复制文件流内容的NSData 并保存它。

  1. Access to root PDF dictionary (CGPDFDocumentGetCatalog)
  2. Get files array (Names > EmbeddedFiles > Names) and itarate through it
  3. 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:


  1. itarate通过所有PDF对象( pdf_load_object

  2. 确定对象嵌入文件( isembed

  3. 如果它是 - 获得它的流并保存文件( saveembed

  1. itarate through all pdf objects (pdf_load_object)
  2. determine if object is embedded file (isembed)
  3. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆