私のプログラムは 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% で始まります。問題のあるストリームは ö> で始まります。これが何を意味するのか、今誰か知っていますか?
助けてくれてありがとう!