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

如何手动修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 07:04:54