PDF流异常编码解析求助:LibreOffice生成文件的非预期编码疑问
问题原因解析
1. 字体子集化与自定义编码
LibreOffice导出PDF时,会对嵌入的字体做子集化处理:只嵌入文档中实际用到的字形,同时为这些字形分配自定义的短编码(比如<01>对应'H',<02>对应'e'),而非直接使用ASCII/Unicode值。这样做是为了尽可能缩小PDF文件体积,这也是你看到<01>这类奇怪编码的核心原因——它们不是字符的原始编码,而是字体子集里的字形映射代码。
2. TJ操作符的用途
你看到的[<01>5<02>-6<03>2<03>2<040506>-2 <040703>2<08>]TJ是PDF的文本数组操作符,和(Hello world) Tj的区别在于:
Tj用于直接显示单个完整字符串,不做精细间距调整TJ支持在字符串片段之间插入间距调整值(比如5、-6这些整数,单位是千分之一的文本空间宽度),LibreOffice用它来优化字符间的排版间距,让文本显示更美观。
3. 如何映射编码到实际字符
要确认这些编码对应的字符,你需要在解压后的PDF中找到该文本使用的字体字典:
- 先从内容流里找到字体引用,比如类似
/F1 12 Tf的行(F1是字体名称) - 搜索
/F1对应的字体字典,查看其中的Encoding字段或ToUnicode表,里面会明确列出<01>、<02>这类编码对应的实际字符(比如<01> /H)。
内容的提问来源于stack exchange,提问作者Teo7
相关产品推荐
相关产品推荐

