我正在尝试使用 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"
时,它不起作用(它会继续解析直到找到最后一个 endobj)。如何修改正则表达式以分别解析每个对象(换句话说,从 1 0 obj 到 endobj 的部分)?
最佳答案
如果您只使用正则表达式,很容易构建您的程序无法处理的 PDF 文件。 PDF 词典和列表可以包含其他对象。 Regex 不能处理递归结构,至少 Python re 模块不能。
pdf 文件是对象和流的树:
- 字典:
<<
(名称值)*>>
- 列表:
[
(值)*]
- 姓名:
/
(常规字符)* - 字符串:
(
(字符)*)
- 十六进制字符串:
<
(十六进制)*>
- 号码:(
-
)? ((数字)+ | (数字)+.
(数字)* |.
(数字)+) - bool 值:
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 找到.
关于python - 在 Python 中使用正则表达式解析 PDF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3915131/