2011-02-01 76 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

相关问题