簡體   English   中英

使用Python中的正則表達式解析PDF文件

[英]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

不完全是您確切問題的答案,但您可能希望查看python中現有的pdf解析庫,例如: pdfminerpyPdf (即使你最終沒有使用它們,你也可以看看它們是如何做到的)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM