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

Android 如何使用MuPDF从pdf中提取嵌入文件,android,pdf,mupdf,Android,Pdf,Mupdf,iOS上的我的应用程序从PDF中提取嵌入文件。现在,我试着让Android应用程序使用相同的功能 在iOS上,我可以使用Quartz2d提取嵌入文件: 访问根PDF字典(CGPDFDocumentGetCatalog) 获取文件数组(名称>嵌入的文件>名称)并通过它进行初始化 将文件流内容从文件字典(EF>F)复制到NSData并保存它 使用MuPDF有什么方法可以做到这一点吗?基于pdfextact.c的解决方案看起来像是bruteforce,但它可以工作: 通过所有pdf对象(pdf\u加载

iOS上的我的应用程序从PDF中提取嵌入文件。现在,我试着让Android应用程序使用相同的功能

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

  • 访问根PDF字典(
    CGPDFDocumentGetCatalog
  • 获取文件数组(名称>嵌入的文件>名称)并通过它进行初始化
  • 将文件流内容从文件字典(EF>F)复制到
    NSData
    并保存它

  • 使用MuPDF有什么方法可以做到这一点吗?

    基于pdfextact.c的解决方案看起来像是bruteforce,但它可以工作:

  • 通过所有pdf对象(
    pdf\u加载\u对象
  • 确定对象是否为嵌入文件(
    isembed
  • 如果是-访问其流并保存文件(
    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);
    }
    

    哪个库用于在PDF批注中添加嵌入文件请帮助我