You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过muPDF(C语言)获取PDF的Trailer字典及对应键名?

如何通过muPDF(C语言)获取PDF的Trailer字典及对应键名?

我来帮你理清这个问题——你遇到的核心困惑是muPDF返回的dict_key不是直接的字符串,这是因为muPDF里的PDF字典键是PDF名称对象(Name Object),而不是原生C字符串,你看到的十六进制值是这个pdf_obj结构体的内部标识,不是字符串指针。

为什么dict_key不是"/Size"?

muPDF的pdf_dict_get_key返回的是pdf_obj*类型,对应PDF里的键对象。Trailer字典里的键(比如/Size、/Root)都是PDF名称类型的对象,而不是直接的C字符串。你看到的0x000001e1是这个对象在muPDF内部的内存地址或标识,不能直接当成字符串来用。

怎么获取实际的键名?

muPDF提供了专门的API来把名称对象转换成可读的C字符串:pdf_to_name。这个函数可以提取名称对象的UTF-8字符串(注意返回的内容不带前导斜杠,如果需要/Size的格式可以自行拼接)。

修改你的代码示例

把循环部分修改成这样,就能拿到预期的键名了:

for (int dict_index = 0; dict_index < dict_len; dict_index++) {
    pdf_obj* dict_key = pdf_dict_get_key(ctx, trailer, dict_index);
    pdf_obj* dict_val = pdf_dict_get_val(ctx, trailer, dict_index);

    // 先判断键是否为名称类型(Trailer里的键基本都是名称)
    const char* key_str = NULL;
    if (pdf_is_name(ctx, dict_key)) {
        // 转换为字符串,返回的字符串由muPDF上下文管理,不要手动free
        key_str = pdf_to_name(ctx, dict_key);
        // 如果需要在上下文生命周期外使用,用fz_strdup复制:
        // char* persistent_key = fz_strdup(ctx, key_str);
    }

    const char* dict_key_type = get_obj_type(ctx, dict_key);
    const char* dict_val_type = get_obj_type(ctx, dict_val);

    // 打印时拼接斜杠,模拟PDF里的键格式
    printf(" [%d] key = %s, keytype = %s, valtype = %s \n", 
           dict_index, 
           key_str ? ("/" + key_str) : "unknown",
           dict_key_type, 
           dict_val_type);
}

额外说明

  1. 对象类型判断:用pdf_is_name可以确保我们只处理名称类型的键,避免转换出错(虽然Trailer字典里的键几乎都是名称,但严谨一点总是好的)。
  2. 内存管理:pdf_to_name返回的字符串是muPDF上下文(fz_context)管理的,当上下文被销毁时,这个字符串也会被释放。如果需要在上下文之外使用这个字符串,必须用fz_strdup复制一份,之后记得用fz_free释放。
  3. 关于dict_val:你看到的'i'是整数类型的标识,对应PDF里的/Size的值(比如20941),这是完全正确的,因为/Size本来就是一个整数值。

这样修改后,你就能看到预期的键名(比如/Size),而不是奇怪的十六进制值了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 09:29:52