2017-03-14 18 views
0

私たちは毎日PDFファイルを配信していますので、画像を取得する必要があります。例えば、私がしたいのは、画像をthis PDF file I haveからPythonで取り戻すことです。ほとんどのpdfファイルは複数ページに分かれており、各埋め込み画像を別々のファイルに書き出したいと考えています。ほとんどがjpegファイルを持っていますが、彼のファイルはありません。zlibデータを解凍してPythonでPDFに保存

オブジェクト5は、zlib圧縮ストリームとして埋め込まれています。私はそれがFlateDecodeとしてマークされ、ストリームの開始点がzlibの典型的な\ x78 \ x9cであるため、zlibが圧縮されていることを確信しています。あなたは見ることができますthe hex dump here

質問は、どのように私はそれを収縮させ、結果ファイルを保存するのですか?

あなたの知恵を分かちていただきありがとうございます。

+0

はい、少なくとも4ページ以上で1日に数十の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は理由なくクラッシュします。また、とにかく展開されるサーバー上に余分なライブラリをインストールすることは許可されていません。だから、私はjpgファイルを抽出するために[\ x78 \ x9c]と画像を抽出するために[このコードは現在(https://gist.github.com/DDecoene/4e91449572a473b278ec887ce61238b5)を使っています。 –

答えて

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)私はサーバ上にライブラリやツールを追加することはできません。サーバは私たちのものではありません:( –

関連する問題