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

修改PDF中Unicode映射表后内容未变更的技术咨询

问题描述

我手动解析PDF文本,提取stream与endstream之间的内容,解码后修改CMap中的bfchar映射项:将<0018>对应<0044>、<0026>对应<0046>改为<0018>对应<0045>、<0026>对应<0047>,期望将PDF内容从“Hello,PDF.”改为“Hello PEG.”,但修改后内容无变化,求问题原因(不使用第三方工具)。

原CMap代码

/CIDInit /ProcSet findresource begin
12 dict begin
begincmap
/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def
/CMapName /Adobe-Identity-UCS def
/CMapType 2 def
1 begincodespacerange
<0000> <FFFF>
endcodespacerange
10 beginbfchar
<0001> <0000>
<0018> <0044>
<0026> <0046>
<002C> <0048>
<0057> <0050>
<011E> <0065>
<016F> <006C>
<017D> <006F>
<0355> <002C>
<0358> <002E>
endbfchar
endcmap CMapName currentdict /CMap defineresource pop end end

修改后的CMap代码

/CIDInit /ProcSet findresource begin
12 dict begin
begincmap
/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def
/CMapName /Adobe-Identity-UCS def
/CMapType 2 def
1 begincodespacerange
<0000> <FFFF>
endcodespacerange
10 beginbfchar
<0001> <0000>
<0018> <0045>
<0026> <0047>
<002C> <0048>
<0057> <0050>
<011E> <0065>
<016F> <006C>
<017D> <006F>
<0355> <002C>
<0358> <002E>
endbfchar
endcmap CMapName currentdict /CMap defineresource pop end end
问题原因分析
  • 修改的CMap未被页面文本引用:PDF文档中可能存在多个CMap,你修改的Adobe-Identity-UCS CMap并没有被目标页面的文本内容关联使用。页面文本可能绑定了其他CMap,或者直接采用内置编码而非自定义CMap,导致修改无效。
  • 未更新PDF交叉引用表:PDF的交叉引用表(xref)记录了每个对象的字节偏移和长度。修改stream内容后,该对象的长度发生了变化,但如果没有更新xref表中对应的条目,PDF阅读器会读取旧的位置数据,自然看不到修改后的内容。
  • Stream重新编码错误:原stream通常是经过压缩编码(比如FlateDecode)的,修改CMap后需要将内容重新编码为原压缩格式。如果编码过程出错,阅读器无法正确解码这个CMap,会自动忽略它而使用默认编码规则。
  • CID与目标字符的映射对应错误:PDF中文本以CID(字符标识符)存储,你需要先确认“PDF”对应的CID是否确实是<0057>(P)、<0018>(D)、<0026>(F)。如果实际文本使用的CID和你修改的映射项不匹配,修改CMap也不会改变显示内容。

内容的提问来源于stack exchange,提问作者JinQuan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:45:11