web-dev-qa-db-ja.com

/ Filter / FlateDecodeからのデータ抽出PDF stream in PHP

次のようにストリームからデータを復号化できません:

_    56 0 obj 
    << /Length 1242 /Filter /FlateDecode >>
    stream
    x]êΩnƒ Ñ{ûbÀKq¬æ\âê¢....(whole binary is omitted)
    endstream
    endobj
_

バイナリコンテンツ(_x]êΩnƒ Ñ{ûbÀKq¬æ\âê¢...._)をファイルとバイナリ文字列に分離しようとしました。デコード関数gzinflate($encripted_data)はデコードエラーを送信しますが、エンコードされたコンテンツが「収縮」していないために起こると思います。

PDF Reference v 1.7、(6版)、67ページで、/ FlateDecodeフィルターの説明を次のように見つけました:... zlib/deflateを使用してエンコードされたデータを解凍します圧縮方法、元のテキストまたはバイナリデータの再生

この "\ FlateDecoded"ストリームをどう処理するか、PHP関数またはアルゴリズム、あるいはその両方を実行する生のソリューションが必要です。

ありがとうございました!

34
Ruben Kazumov
_header('Content-Type: text');           // I going to download the result of decoding
$n = "binary_file.bin";                 // decoded part in file in a directory
$f = @fopen($n, "rb");                  // now file is mine
$c = fread($f, filesize($n));           // now I know all about it 
$u = @gzuncompress($c);                 // function, exactly fits for this /FlateDecode filter
$out = fopen("php://output", "wb");     // ready to output anywhere
fwrite($out, $u);                       // output to downloadable file
_

ジングルベル!ジングルベル!...

gzuncompress()-ソリューション

15
Ruben Kazumov

one解凍されたストリームのみにアクセスする必要があるのか​​、すべてのストリームを解凍する必要があるのか​​わからなかったので、簡単なコマンドラインツールをお勧めします完全なPDFを作成するために1回で実行します:Jay Berkenbiltのqpdf

コマンドラインの例:

 qpdf --qdf --object-streams=disable in.pdf out.pdf

out.pdfは、テキストエディタで検査できます(埋め込まれたICCプロファイル、画像、およびフォントのみがバイナリである可能性があります)。

qpdfは、オブジェクトを自動的に並べ替え、PDF構文を正規化された方法で表示します(また、圧縮解除されたオブジェクトの元のオブジェクトIDをコメントで伝えますだった)。

ファイルを再度圧縮する必要がある場合(編集後など)、次のコマンドを実行します。

 qpdf out-edited.pdf out-recompressed.pdf

(ユーティリティが破損したファイルを修復しようとしたことを示す警告メッセージが表示される場合があります。..)

qpdfはマルチプラットフォームであり、 Sourceforge から入手できます。

53
Kurt Pfeifle

長い間延期されたが、誰かがそれを助けてくれるかもしれない。この場合:<</Length 1242/Filter/FlateDecode >>必要なのは、隔離されたバイナリ文字列(つまり、基本的に「ストリーム」と「エンドストリーム」の間のすべて)をzlib.decompressに渡すことだけです。

import zlib
stream = b"êΩnƒ Ñ{ûbÀKq¬æ\âê"  # binary stream here
data = zlib.decompress(stream) # Here you have your clean decompressed stream

ただし、PDFオブジェクトに/ DecodeParmsが含まれている場合は複雑になります。/Predictorの値と列番号が必要になります。これにはPyPDF2を使用することをお勧めします。

5
Belial