在Python中使用正则表达式解析PDF文件

2024-04-19 00:53:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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的部分)?在


Tags: 文件对象reobj元素示例目标pdf
3条回答

重复部分后的问号应使用最少的字符数。也不需要逗号,因为\S已经考虑了它。在

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

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

另外,请注意,PDF格式非常复杂,尤其是当它开始包含二进制流时,但是如果您知道您要查看的PDF文件很简单,那么这应该是可行的。在

如果只使用regex,则很容易构造程序无法处理的PDF文件。PDF字典和列表可以包含其他对象。Regex不能处理递归结构,至少不能处理Python的re-module。在

pdf文件是对象和流的树:

  • 词典:<<(名称值)*>>
  • 列表:[(值)*]
  • 名称:/(常规字符)*
  • 字符串:((字符)*)
  • 十六进制字符串:<(hexchar)*>
  • 号码:(-)?((数字)+|(数字)+.(数字)*| .(数字)+)
  • 布尔值:true| false
  • 参考文献:(数字)+(空白)+(数字)+(空白)+R

空格和注释在大多数地方被忽略。 注释以%开头,一直运行到行尾。在

间接对象指定为:

1 0 obj
(any object)
endobj

然后可以将此对象引用为1 0 R。间接字典也可以附加流:

^{pr2}$

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找到。在

相关问题 更多 >