我需要知道PDF字典的值的编码(不是显示给用户的文本,而是“后面的代码”)。
我计划不使用任何库。
在哪里可以找到它?

最佳答案

PDF字典值的编码


PDF字典的值是PDF对象。

您应该查看PDF规范ISO 32000-1,尤其是第7章语法,以了解有关PDF对象的信息。你会找到:


界定对象并描述PDF文件结构的标记应使用ASCII字符
组。此外,所有保留字和名称均用作PDF标准词典和
某些类型的数组应使用ASCII字符集定义。


因此,大多数时候您必须处理ASCII值。

但是,这种情况对于字符串来说比较棘手,因为有几种类型的字符串使用相同的字符串语法选项,因此您必须根据其上下文来解释其内容。


表35 –字符串对象类型

类型说明

文本字符串用于人类可读的文本,例如文本
批注,书签名称,文章名称和
文档信息。这些字符串应被编码
将PDFDocEncoding或UTF-16BE与
前导字节顺序标记。
7.9.2.2,“文本字符串类型”中描述了此类型。

PDFDocEncoded字符串应用于以下字符和字形
使用PDFDocEncoding以单个字节表示。
7.9.2.3,“ PDFDocEncoded String”中描述了此类型。
类型。”

ASCII字符串应用于以
使用ASCII编码的单字节。

字节字符串用于二进制数据,表示为一系列
字节,其中每个字节可以是可表示为
8位。该字符串可能代表字符,但
编码未知。字符串的字节不需要
代表字符。此类型应用于数据
例如MD5哈希值,签名证书和Web
捕获标识值。
在7.9.2.4“字节字符串类型”中描述了此类型。


如果字符串是值,例如作者元数据的名称,它是一个文本字符串,因此使用PDFDocEncoding或带有前导字节顺序标记的UTF-16BE对其进行编码。

另一方面,如果字符串是值,例如签名字典中的内容,它是一个字节字符串,其中包含一个二进制对象,任何根据某种编码解释它的尝试都会失败。

对于流来说,情况更加棘手。

首先,流内容可以以某种方式被处理,例如。它可能被压缩了。要获取实际的流内容,您首先必须撤消该处理。

内容可以是二进制的,例如字体程序或文本,例如JavaScript,也可以是内容流,例如页面内容。


内容流是PDF流对象,其数据由描述指令的指令序列组成。
要在页面上绘制的图形元素。指令应以PDF对象的形式表示,
使用与PDF文档其余部分相同的对象语法。


因此,它们大多是ASCII值。再次例外是文本绘图指令的字符串参数。它们的编码完全取决于绘制字符串时当前选择的字体,并且字体可以使用标准编码,但是它们也可以使用完全混乱的即席编码。

PS:如果您碰巧尝试分析加密的PDF,则会发现Encryption
适用于文档PDF文件中的所有字符串和流,只有少数例外。特别地,加密不适用于字典和数组结构,数字和名称。因此,没有意识到这一点的人可能不会认识到PDF是加密的,而是假设字符串和流是以非常奇怪的方式编码的。

关于pdf - PDF字典的编码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35068916/

10-12 12:41
查看更多