2017-08-07 32 views
1

我一直在嘗試大約一個星期來自動從pdf中提取圖像。不幸的是,我在這裏找到的答案沒有任何幫助。我使用pypdf2在相同的代碼中看到了多個變體,全部都是['/XObject'],這導致了KeyError使用python查找和識別PDF中的流

我正在尋找的東西似乎隱藏在流中,我在pypdf2的字典中找不到(即使在遞歸探索整個結構之後,在我能找到的每個間接對象上調用.getObject())。

使用pypdf2我已經寫了一頁pdf並打開它使用Notepad++,以找到一些流與/FlateDecode過濾器。

pdfrw稍微更多的幫助,讓我用PdfReader(path).pages[page].Contents.stream獲得一個流(不知道如何讓別人)。

使用zlib,我解壓縮它,得到的東西開始:

/Part <</MCID 0 >>BDC 

(它也含有大量的浮點數的,正面和負面的)

從我能找到,BDC與ghostscript有關。

在這一點上,我放棄了,並決定尋求幫助。

是否有一個Python的工具,至少,提取所有流(並確定FlateDecode標籤?)

,是有辦法,我找出什麼是隱藏在那裏?我預計一些圖像格式的開始標記,這顯然不是。我如何進一步解析這個結果來找到可能隱藏在那裏的圖像?

我正在尋找一些我可以應用於任何正確顯示的PDF的東西。一些工具可以進一步解析,或者至少幫助我理解流,甚至可以幫助我理解正在發生的事情。

編輯:正如帕特里克所指出的,我似乎在咆哮着錯誤的樹。我找到了流,因爲我在Notepad++中打開PDF時,或者運行用於解析PDF的各種Python腳本時找不到任何xObjects。我設法找到了我懷疑的圖像,沒有xObject標籤,但看起來像是一個流標籤 - 雖然信息沒有被壓縮。

+0

有很多生成PDF文件的工具(其中很多都是邊界缺陷),如果沒有看到特定文檔的樣本會給您帶來麻煩,很難給出建議。有一些你可以分享的樣本嗎? –

+0

@PauloScardine對不起,我意識到我的措辭意味着我正在尋找特定PDF的幫助。 PDF文檔在閱讀器中正確顯示,我可以毫無問題地從中提取頁面。只是找不到任何關於流內容的參考(或者任何可以輕鬆爲我做的python工具,那也會很好)。 無論如何,尋找適用於正確顯示的任何PDF文檔的內容。 – user1999728

+0

你*有東西開始: '/ Part <> BDC' *和*在這一點放棄*?爲什麼?您成功抵達了PDF內容流。你只需要採用pdf規範ISO 32000-1來解釋流內容。 – mkl

回答

1

除非您正在尋找提取不常見的內嵌圖像,否則內容流不是查找圖像的地方。更常見的情況是類型爲XObject的Streams,它是子類型Image,它們通常位於頁面的Resource-> XObject字典中(請參閱由PDF文件指定的PDF參考的第7.3.3,7.8.3和8.95節)。

或者,Image XObjects也可以在Form XObjects(子類型表單,表示它們有自己的內容流)中的Resource-> XObject字典中找到,因此Image XObjects的搜索可以是遞歸的。

一個Image XObject也可以有一個softMask,它本身就是它自己的Image XObject。表單XObjects也用於平鋪模式,因此可以包含Image XObjects(但它們並不常見),或者用於Annotation的Normal Appearance(但在此類註釋中不常用Image XObjects,除了3D或多媒體註釋)。