【问题标题】:How to extract embedded files from pdf using MuPDF如何使用 MuPDF 从 pdf 中提取嵌入文件
【发布时间】:2013-01-08 08:42:23
【问题描述】:

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

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

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

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

【问题讨论】:

  • 哪个库用来在PDF注释中添加嵌入文件请帮帮我

标签: android pdf mupdf


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    相关资源
    最近更新 更多