我正在尝试使用Python的re模块解析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)。如何修改正则表达式以便单独解析每个对象(换句话说,从10 0 obj到endobj的部分)?
答案 0 :(得分:8)
如果您只使用正则表达式,则很容易构建程序无法处理的PDF文件。 PDF词典和列表可以包含其他对象。正则表达式无法处理递归结构,至少不能处理Python re模块。
pdf文件是对象和流的树:
<<
(名称值)* >>
[
(值)* ]
/
(常规字符)* (
(字符)* )
<
(hexchar)* >
-
)? ((数字)+ |(数字)+ .
(数字)* | .
(数字)+)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找到。
答案 1 :(得分:2)
您需要使用*?
作为非贪婪版本 - 请参阅documentation here。
另外,请注意PDF格式非常复杂 - 特别是当它开始在其中包含二进制流时 - 但如果您知道您正在查看的PDF很简单,那么这应该有效。
答案 2 :(得分:2)
重复部分后的问号应占用最少量的字符。此外,逗号也不是必需的,因为\S
已将其考虑在内。
\d+\s\d+\sobj[\s\S]*?endobj
答案 3 :(得分:2)