2010-10-12 125 views
2

我想使用Python的重新模块从PDF文件中解析一些对象元素。我的目标是使用正则表达式解析每个PDF对象。 一个PDF对象示例如下:
使用Python中的正则表达式解析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最后endobj被发现)。我如何修改正则表达式来分别解析每个对象(换句话说,从1 0 obj直到endobj)?

回答

1

您需要使用*?作为非贪婪版本 - 请参阅documentation here

此外,请注意,PDF格式非常复杂 - 特别是当它开始有二进制流 - 但如果你知道你正在看的PDF很简单,那么这应该工作。

1

重复部分后面的问号应该占用最少量的字符。此外,逗号并不是必需的,因为\S已将其考虑在内。

\d+\s\d+\sobj[\s\S]*?endobj 
2

不完全是一个答案,你确切的问题,但你可能想看看在Python现有的PDF解析库,例如:pdfminerpyPdf。 (即使你最终没有使用它们,你也可以看看它们是如何做到的)

6

如果你只使用正则表达式,很容易构造一个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找到。