44

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

    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関数または/およびアルゴリズムが必要です。

ありがとう!

4

4 に答える 4

71

1つの解凍されたストリームのみにアクセスする必要があるのか​​、すべてのストリームを解凍する必要があるのか​​わからなかったので、完全なPDFを一度に実行する簡単なコマンドラインツールであるJayBerkenbiltをお勧めします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から入手できます

于 2012-07-31T01:55:22.167 に答える
18
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()- ソリューション

于 2012-07-31T02:48:37.127 に答える
7

長い間延期されましたが、誰かがそれを役立つと思うかもしれません。この場合:<< / Length 1242 / Filter / FlateDecode >>必要なのは、分離されたバイナリ文字列(つまり、基本的に「stream」と「endstream」の間のすべて)を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を使用することをお勧めします。

于 2017-01-13T15:20:17.557 に答える
-1

使ったばかり

import de.intarsys.pdf.filter.FlateFilter;

jpod / source forgeから、それはうまく機能します

FlateFilter filter = new FlateFilter(null);
byte[] decoded = filter.decode(bytes, start, end - start);

バイトはPDFファイルから直接取得されます

于 2014-11-27T15:57:25.187 に答える