我需要知道PDF字典值的编码(不是显示给用户的文本,而是"后面的代码")。 我打算不为此使用任何库。 我在哪里可以找到它?
答案 0 :(得分:2)
您可以在PDF规范(http://www.adobe.com/devnet/pdf/pdf_reference.html)中找到它。详细说明你问题中最重要的一点......
1)PDF词典可以包含各种值类型(布尔值,数字,字符串......)。您将要遇到的编码取决于值的类型。
2)大多数情况下,有趣且复杂的情况是对象的类型是字符串。
3)对于字符串,请阅读PDF规范中的第7.9.2节。这解释了可以将哪些编码用于此类字符串(PDFDocEncoding,Unicode编码...)以及如何识别您对特定字符串的编码。
答案 1 :(得分:2)
PDF词典值的编码
PDF字典的值是PDF对象。
您应该查看PDF规范ISO 32000-1,特别是第7章语法,以了解PDF对象。你会发现:
分隔对象和描述PDF文件结构的标记应使用ASCII字符 组。此外,所有保留字和用作PDF标准词典中的键的名称 某些类型的数组应使用ASCII字符集定义。
因此,大多数时候你必须处理ASCII值。
但是,字符串的情况很棘手,因为有几种类型的字符串使用相同的字符串语法选项,因此您必须根据其上下文解释其内容。
表35 - 字符串对象类型
输入说明
文本字符串应用于人类可读的文本,例如文本 注释,书签名称,文章名称和 文件信息。这些字符串应编码 使用PDFDocEncoding或UTF-16BE 前导字节顺序标记。 此类型在7.9.2.2“文本字符串类型”中进行了描述。
PDFDocEncoded string 应该用于字符和字形 使用PDFDocEncoding以单个字节表示。 此类型在7.9.2.3“PDFDocEncoded String中描述 型“。
ASCII字符串应该用于表示的字符 使用ASCII编码的单字节。
字节字符串应该用于表示为一系列的二进制数据 字节,其中每个字节可以是任何可表示的值 8位。字符串可以表示字符但是 编码未知。字符串的字节不需要 代表人物。该类型应用于数据 例如MD5哈希值,签名证书和Web 捕获标识值。 此类型在7.9.2.4“字节字符串类型”中进行了描述。
如果字符串是值,例如作者元数据的元数据,它是一个文本字符串,因此使用带有前导字节顺序标记的PDFDocEncoding或UTF-16BE进行编码。
另一方面,如果字符串是值,例如内容在签名字典中,它是一个包含二进制对象的字节字符串,任何根据某些编码解释它的尝试都将失败。
流的情况更加棘手。
首先,可以以某种方式处理流内容,例如,它可能会被压缩。要获得实际的流内容,首先必须撤消此处理。
内容可以是二进制的,例如字体程序或文本,例如JavaScript,或者它可以是内容流,例如页面内容。
内容流是一个PDF流对象,其数据由描述该数据的一系列指令组成 要在页面上绘制的图形元素。说明应以PDF对象的形式表示, 使用与PDF文档其余部分相同的对象语法。
因此,它们大多是ASCII值。异常也是文本绘制指令的字符串参数。它们的编码完全取决于绘制字符串时当前选择的字体,字体可能使用标准编码,但它们也可能使用完全混乱的ad-hoc编码。
PS:如果您碰巧尝试分析加密的PDF,您会发现加密 适用于文档PDF文件中的所有字符串和流,只有极少数例外。特别是加密不适用于字典和数组结构,数字和名称。因此,不知道这一点的人可能不会认识到PDF是加密的,而是假设字符串和流以非常奇怪的方式编码。
答案 2 :(得分:1)
补充@ mkl&@和DavidvanDriessche的优秀答案...
这里有三个OpenSource命令行工具,可以帮助您将任何PDF转换为不同的形式,扩展/解压缩/解码对象流(注意,没有一个," the-one-and -only-correct"这样做的方式 - 所以每个工具的输出都不同):
pdftk
强> mutool
强> qpdf
强> 每个都应该通过您最喜欢的操作系统包管理器提供。
pdftk
示例用法:
pdftk in.pdf cat output out1.pdf uncompress
mutool
示例用法:
mutool clean -d in.pdf out2.pdf
qpdf
示例用法(我最喜欢的工具):
qpdf --qdf --object-streams=disable in.pdf out3.pdf
你应该尝试其中的每一个,比较不同输入PDF的输出,然后决定哪一个是你最喜欢的(但是当遇到你喜欢的显示意外结果的情况时,永远不要忘记记住其他工具。)