1

私のプログラムは PDF ファイルを処理し、それらからいくつかのストリームを読み取ります。そこには FlateEncoded ストリームもあります。zlib の "inflate()" メソッドを使用して解凍します。

これは通常、次のコードで非常にうまく機能します。

static string FlateDecode(string s){

    int factor = 50;
    z_stream stream;
    while(true){
        char * out = new char[s.length()*factor];           

        stream.zalloc = Z_NULL;
        stream.zfree = Z_NULL;
        stream.opaque = Z_NULL;
        stream.avail_in = s.length();
        stream.next_in = (Bytef*)s.c_str();
        stream.avail_out = s.length()*factor;
        stream.next_out = (Bytef*)out;
        inflateInit(&stream);
        inflate(&stream, Z_FINISH);
        inflateEnd(&stream);


        if(stream.total_out >= factor*s.length()){
            delete[] out;
            factor *= 2;
            continue;

        }
        string result;
        for(unsigned long i = 0; i < stream.total_out; i++){
            result += out[i];
        }

        delete[] out;
        return result;
    }
}

ただし、一部のストリームでは inflate の結果が空になります。頻繁ではありませんが、起こります。誰かが理由を知っていますか?

すべての PDF リーダーが PDF ファイルを正しく読み取るため、ストリームは正常である必要があります。

ご協力いただきありがとうございます!

アップデート

PDFとストリームをアップロードしましたので、ご自分で確認してください。

PDF -> ストリームはバイト 43296 から始まります

ストリーム

更新 2

解凍できないストリームと解凍できるストリームを比較しました。興味深いことに気付きました: 作業ストリームはすべて 2 バイトの H% で始まります。問題のあるストリームは ö> で始まります。これが何を意味するのか、今誰か知っていますか?

助けてくれてありがとう!

4

2 に答える 2

2

反復ごとにストリームを再初期化しないでください。ループの前に初期化し、または inflate()を返すまでループ内で呼び出します。Z_OKZ_STREAM_END

于 2011-02-01T15:42:40.967 に答える
0

zlib は、PDF ファイルにあるすべての圧縮されたストリームをサポートしていないようです。

于 2011-05-19T12:34:40.460 に答える