2017-03-14 41 views
0

我們每天都會將PDF文件發送給我們,我們需要獲取圖像。例如,我想要做的就是用python將圖像從this PDF file I have中取出。我們獲得的大多數pdf文件都是多頁,我們希望將每個嵌入式圖像導出爲單獨的文件。大多數都有jpeg文件,但他的文件卻沒有。使用python解壓並保存PDF格式的zlib數據

對象5被嵌入爲zlib壓縮流。我很確定它是zlib壓縮的,因爲它被標記爲FlateDecode,並且流的開始是zlib的典型\ x78 \ x9c。你可以看到(部分)the hex dump here

問題是,我怎麼「放氣」它並保存結果文件。

謝謝你分享你的智慧。

+0

是的,我們每天至少會有四頁pdf文件。我們需要自動提取,相信我。 –

+0

您是否檢查過[this](http://stackoverflow.com/questions/2693820/extract-images-from-pdf-without-resampling-in-python)?谷歌搜索給了我[這個](http://mikelynchgames.com/software-development/using-wand-to-extract-pngs-from-pdfs/)。 –

+0

是的,當我嘗試使用魔杖(最簡單)時,我的整個macbook崩潰沒有理由。而且,我也不允許在要部署它的服務器上安裝額外的庫。因此,我現在使用[此代碼](https://gist.github.com/DDecoene/4e91449572a473b278ec887ce61238b5)來提取jpg文件,但帶有「\ x78 \ x9c」的圖像我不知道該怎麼做。 –

回答

0

我到處搜索,並嘗試了很多東西,但無法工作。我設法解壓縮這樣的數據:

import zlib 
with open("MDL1703140088.pdf", "rb") as f: 
    pdf = f.read() 

image = zlib.decompress(pdf[640:69307]) 

640 zlib的頭(b'x\x9c')的位置和69307是像PDF規範的頁腳位置。 b'\nendstream\n'在那裏。詳情在the spec和一些有用的Q & A可以找到here。但在這種情況下,允許省略結束位置,因爲decompress()似乎忽略非壓縮數據。您可以通過以下方式進行驗證:

decomp = zlib.decompressobj() 
image = decomp.decompress(pdf[640:]) 
print(decomp.unused_data) # starts from b'\nendstream\n 

目前爲止這麼好。但是,當我將image寫入PNG文件時,它不能被任何圖像查看器讀取。實際上解壓縮的數據在這裏和那裏看起來非常空虛。我附上了一些PNG標題,但沒有運氣。嘿,這太...

正如我前面所說(奇怪的是我的評論被某人刪除),你最好使用一些其他現有的工具。如果Acrobat不是您的選擇,那麼pdftopng (part of Xpdf)呢? pdftopng MDL1703140088.pdf .完美地給了我一個有效的PNG文件。你可能知道,很顯然,命令行工具可以用Python來執行。

+0

使用pdftopng是一個好主意,當然,但是(總是存在但不存在; D)我不能在要運行的服務器上添加庫或工具。服務器不是我們的:( –