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

标签 python regex parsing pdf

我正在尝试使用 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/

相关文章:

c++ - 从文件发出阅读空间

javascript - Javascript 中对应的正则表达式

c - 在 C 中使用 sscanf 从文件中读取多行字符串

python - 为什么 CPU 上的 Keras LSTM 比 GPU 快三倍?

python - json.decoder.JSONDecodeError : Expecting value: line 1 column 1 (char 0) KeyError: ["Data Bytes 1: "]

Python 正则表达式在与 re.findall 一起使用时返回匹配的一部分

regex - 从文本字符串中提取第一个句子

json - 根据给定的JSON文件创建域类

python - 属性错误 : 'Logger' object has no attribute ‚WARNING'

python - 在不产生黑色外壳窗口的情况下启动 GUI 进程