如何通过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); }
额外说明
- 对象类型判断:用
pdf_is_name可以确保我们只处理名称类型的键,避免转换出错(虽然Trailer字典里的键几乎都是名称,但严谨一点总是好的)。 - 内存管理:
pdf_to_name返回的字符串是muPDF上下文(fz_context)管理的,当上下文被销毁时,这个字符串也会被释放。如果需要在上下文之外使用这个字符串,必须用fz_strdup复制一份,之后记得用fz_free释放。 - 关于
dict_val:你看到的'i'是整数类型的标识,对应PDF里的/Size的值(比如20941),这是完全正确的,因为/Size本来就是一个整数值。
这样修改后,你就能看到预期的键名(比如/Size),而不是奇怪的十六进制值了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

