簡體   English   中英

如何使用MuPDF從pdf提取嵌入式文件

[英]How to extract embedded files from pdf using MuPDF

我在iOS上的應用從PDF提取嵌入式文件。 現在,我嘗試使用MuPDF使Android應用程序具有相同的功能。

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

  1. 訪問根PDF字典( CGPDFDocumentGetCatalog
  2. 獲取文件數組(名稱> EmbeddedFiles>名稱)並通過它陣列化
  3. 將文件流內容從文件字典(EF> F)復制到NSData並保存。

MuPDF有什么辦法做到這一點?

基於pdfextact.c的解決方案看起來像蠻力的,但它的工作原理是:

  1. 遍歷所有pdf對象( pdf_load_object
  2. 確定對象是否為嵌入式文件( isembed
  3. 如果是,請訪問它的流並保存文件( saveembed

在大多數測試案例中,嵌入式文件存儲在文件末尾,因此,reverce迭代具有意義。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM