2011-02-01 51 views
1

我的程序處理PDF文件並從中讀取一些流。那裏還有FlateEncoded流。我使用zlib的「inflate()」方法來解壓縮它們。zLib充氣在某些情況下爲空效果

這通常作品真的很好用下面的代碼:

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; 
    } 
} 

但膨脹有一些流空的結果。這不是經常發生,但它發生了。有人知道爲什麼嗎?

流必須正確,因爲所有PDF閱讀器都能正確讀取PDF文件。

感謝您的幫助!

UPDATE

我已上載的PDF和流這樣你就可以自己檢查一下。

PDF - >的流開始於字節43296

Stream

UPDATE 2

我比較了這不容與可被解壓縮的數據流進行解壓縮的數據流。我注意到一件有趣的事情:工作流都以2個字節H%開始。有問題的流以ö>開頭。現在有人說這是什麼意思嗎?

感謝您的幫助!

+0

「膨脹有空結果」是什麼意思? (我猜這是膨脹返回0,但你不檢查任何膨脹調用的返回值,你**絕對應該**) – nos 2011-02-01 15:24:04

+0

這意味着當我膨脹一些數據時,流的值.total_out是0,這意味着沒有輸出 - >返回的字符串的長度也是0。 – 2011-02-01 15:28:51

+0

你有多確定輸入實際上是「可充氣的」?你有沒有嘗試輸出到文件並通過命令行確認輸入實際上是有效的?另外,`inflate()`的返回值是多少? – JaredC 2011-02-01 15:32:50

回答

0

zlib似乎不支持PDF文件中找到的所有壓縮流。

2

您不應該在每次迭代時重新初始化流。在循環之前初始化它,並在循環中調用inflate(),直到它返回Z_OKZ_STREAM_END

相關問題