如何手动修改PDF的Names Dictionary以更新嵌入文档文件名?
手动更新PDF Names Dictionary修改嵌入文档文件名指南
Alright, let's break down exactly how to tackle this. First, those <FEFF...> strings you're looking at are UTF-16 Big Endian (with BOM) encoded filenames in hex format—FEFF is the byte order marker for UTF-16BE. Here's a step-by-step walkthrough:
1. 解码现有文件名,明确修改对象
拿你提供的第一个编码片段<FEFF003C00320030003E0061002E006A00700067>来说:
- 先去掉开头的
FEFF(这只是UTF-16BE的字节顺序标记,不属于文件名本身) - 把剩余的十六进制字符按每两位拆分:
003C,0032,0030,003E,0061,002E,006A,0070,0067 - 把每组转成对应字符:
003C是<,0032是2,0030是0,003E是>,0061是a,002E是.,006A是j,0070是p,0067是g - 组合起来就是
<20>a.jpg——这就是当前对应的嵌入文档文件名。
2. 生成新文件名的UTF-16BE十六进制编码
假设你要把<20>a.jpg改成<20>new_photo.jpg,可以用简单的Python代码生成对应编码:
target_filename = "<20>new_photo.jpg" # 先转成UTF-16BE字节流,再加上FEFF字节顺序标记 encoded_bytes = b"\xFE\xFF" + target_filename.encode("utf-16be") # 转成大写十六进制字符串,再包裹上<> hex_result = f"<{encoded_bytes.hex().upper()}>" print(hex_result)
运行后会得到类似<FEFF003C00320030003E006E00650077005F00700068006F0074006F002E006A00700067>的字符串,这就是你要替换的内容。
3. 编辑PDF的Names Dictionary对象
用纯文本编辑器(比如VS Code、Sublime、Notepad++,别用富文本编辑器)打开PDF文件,找到你提到的25 0 obj块:
- 定位到
/Names数组,原内容大概是:/Names[<FEFF003C00320030003E0061002E006A00700067>26 0 R<FEFF003C00320030003E0061006C006D006F006E00640073002E007000640066>27 0 R...] - 把旧的十六进制文件名字符串替换成你刚生成的新字符串,注意保留后面的对象引用(比如
26 0 R),这些是链接到实际嵌入文件的关键,不能修改。
4. 修复PDF(关键步骤!)
手动修改会破坏PDF的交叉引用表,直接保存的文件大概率无法正常打开,需要用工具修复:
- 用pdftk的话,在终端运行:
pdftk your_edited.pdf output fixed.pdf - 或者用qpdf做更可靠的修复:
qpdf your_edited.pdf fixed.pdf
这一步会重建交叉引用表,让PDF恢复正常可读性。
实用提示
- 确保新的十六进制字符串被
<和>包裹,这是PDF十六进制字符串的语法要求。 - 如果嵌入文件的字典里同时有
/UF(Unicode文件名)和/F(传统文件名)条目,最好同时更新两者,避免出现文件名不一致的问题。 - 永远在副本上操作,别直接修改原始PDF文件!
内容的提问来源于stack exchange,提问作者John Richardson
相关产品推荐
相关产品推荐

