数字以四字节编码的字符编码类型及PDF文本解码方案咨询
处理自定义编码的PDF文本提取问题
问题背景
收到一份需程序化处理的商务PDF文档,无法正常解码其文本层。在Acrobat中显示内容为180CTNS 1800PCS,但提取底层文本层字节后得到以下十六进制序列:
f4 80 80 94 f4 80 80 9b f4 80 80 93 f4 80 80 a6 f4 80 80 b7 f4 80 80 b1 f4 80 80 b6 20 f4 80 80 94 f4 80 80 9b f4 80 80 93 f4 80 80 93 f4 80 80 b3 f4 80 80 a6 f4 80 80 b6
可见生成该PDF的软件使用了自定义映射:数字'0'对应编码F480 8093,'1'对应F480 8094等,但无法用Python标准库编解码器解码该字节序列。
问题解答
1. 能否通过查询PDF文档得知Plane-B码点\U00100014对应数字'1'的显示规则?
可以通过分析PDF内部的字体映射表确认映射关系:
- 查看PDF的字体字典,找到对应字体的
ToUnicodeCMap表,这个表直接定义了CID(字符标识符)到Unicode码点的映射,可直接查到U+100014对应的实际显示字符。 - 若PDF未嵌入
ToUnicode表,可查看字体的Encoding字典与字符集描述,结合字形名称(比如g1对应数字'1')反向推导映射规则。 - 也可借助PDF解析工具(如
pdftotext带参数解析,或专业PDF结构查看器)提取字体相关的映射数据。
2. 自行编写伪解码器是否为更优方案?
针对该客户的文件,自行编写映射解码器是高效且可行的最优方案:
- 先通过手动对照(Acrobat显示内容与提取的字节序列)建立完整字符映射表,示例如下:
# 示例映射表(需根据实际对照结果补充完整) char_mapping = { b'\xf4\x80\x80\x93': '0', b'\xf4\x80\x80\x94': '1', b'\xf4\x80\x80\x9b': '8', b'\xf4\x80\x80\xa6': 'C', b'\xf4\x80\x80\xb7': 'T', b'\xf4\x80\x80\xb1': 'N', b'\xf4\x80\x80\xb6': 'S', b'\xf4\x80\x80\xb3': 'P', b' ': ' ' } - 编写解码逻辑:按4字节为单位拆分目标字节序列,匹配映射表替换为对应字符,同时处理空格这类单字节特殊字符。
- 优势:无需依赖复杂的PDF解析库,直接针对该客户稳定的自定义编码规则处理,适配同类型文件的一致性需求,后续维护成本极低。
内容的提问来源于stack exchange,提问作者Kilian Foth
相关产品推荐
相关产品推荐

