[英]Parsing PDF file using Regular expressions in Python
我試圖使用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最后一個endobj被找到)。 如何修改正則表達式以便單獨解析每個對象(換句話說,從10 0 obj到endobj的部分)?
如果您只使用正則表達式,則很容易構建程序無法處理的PDF文件。 PDF詞典和列表可以包含其他對象。 正則表達式無法處理遞歸結構,至少不能處理Python re模塊。
pdf文件是對象和流的樹:
<<
(名稱值)* >>
[
(值)* ]
/
(常規字符)* (
(char)* )
<
(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的網站上找到。
你需要使用*?
作為非貪婪的版本 - 請參閱此處的文檔 。
另外,請注意PDF格式非常復雜 - 尤其是當它開始在其中包含二進制流時 - 但是如果您知道您正在查看的PDF很簡單,那么這應該可行。
重復部分后面的問號應占用最少量的字符。 此外,逗號也不是必需的,因為\\S
已將其考慮在內。
\d+\s\d+\sobj[\s\S]*?endobj
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.