我试图用Python的re-module从PDF文件中解析一些对象元素。我的目标是使用正则表达式解析每个PDF对象。
PDF对象示例如下:
1 0 obj
<<
/Type /Catalog
/Pages 2 0 R
>>
endobj
2 0 obj
<<
/Type /Pages
/Kids [ 3 0 R ]
/Count 1
>>
endobj
...
当我使用"\d+\s\d+\sobj[\s,\S]*endobj"
时,它不起作用(它继续解析util last endobj is found)。如何修改正则表达式以便分别解析每个对象(换句话说,从1 0 obj到endobj的部分)?在
重复部分后的问号应使用最少的字符数。也不需要逗号,因为
\S
已经考虑了它。在您需要使用
*?
作为非贪婪版本-请参见documentation here。在另外,请注意,PDF格式非常复杂,尤其是当它开始包含二进制流时,但是如果您知道您要查看的PDF文件很简单,那么这应该是可行的。在
如果只使用regex,则很容易构造程序无法处理的PDF文件。PDF字典和列表可以包含其他对象。Regex不能处理递归结构,至少不能处理Python的re-module。在
pdf文件是对象和流的树:
<<
(名称值)*>>
[
(值)*]
/
(常规字符)*(
(字符)*)
<
(hexchar)*>
-
)?((数字)+|(数字)+.
(数字)*|.
(数字)+)true
|false
R
空格和注释在大多数地方被忽略。 注释以
%
开头,一直运行到行尾。在间接对象指定为:
然后可以将此对象引用为
^{pr2}$1 0 R
。间接字典也可以附加流:PDF文件如下所示:
对象树的根是
trailer
对象。每个对象都直接或间接地从这个字典中引用。在流中隐藏了更多的复杂性,但这不会影响文件结构。在
完整的规范可以在Adobe's website找到。在
相关问题 更多 >
编程相关推荐