如果你只使用正则表达式,很容易构造一个PDF文件,你的程序不会是能够处理。 PDF字典和列表可以包含其他对象。正则表达式无法处理递归结构,至少不是Python重新模块。
PDF文件为对象的树和溪流:
- 词典:
<<
(名称值)* >>
- 列表:
[
(值)* ]
- 名称:
/
(普通字符)*
- 字符串:
(
(char)* )
- 十六进制字符串:
<
(hexchar)* >
- 编号:(
-
)? (digit)+ |(digit)+ .
(digit)* | .
(digit)+)
- 布尔值:
true
| false
- 参考文献:(数字)+(空格)+(数字)+(空格)+
R
空白和注释在大多数地方被忽略。 评论从%
开始,直到行尾。
间接对象被指定为:
1 0 obj
(any object)
endobj
此对象然后可作为1 0 R
引用。间接字典也可以有流附:
1 0 obj
<<
/Length 22
>>
stream
(22 bytes of raw data)
endstream
endobj
一个PDF文件看起来是这样的:
%PDF-1.4
%ÿÿÿÿ
1 0 obj
<< /Author (MizardX) >>
endobj
2 0 obj
<<
/Type /Catalog
% more required keys
>>
endobj
%lots of more indirect objects, one after another
trailer
<<
/Info 1 0 R
/Root 2 0 R
% ... more required keys
>>
xref
0 3
0000000000 65535 f
0000000015 00000 n
0000000054 00000 n
startxref
225
%%EOF
对象树的根是trailer
对象。每个对象都直接或间接地从这个字典中引用。
流中隐藏着更多的复杂性,但不影响文件结构。
完整的规格可在Adobe's website找到。