使用zlib C ++缩小和扩充PDF

时间:2016-02-11 09:35:08

标签: c++ c pdf zlib deflate

我正在尝试实现" zlib.h" deflate和inflate函数来压缩和解压缩PDF文件中的流。 输入:来自PDF文件的压缩流。我实现了膨胀功能 - 它没关系,我有未压缩的流,之后我尝试用deflate函数再次压缩这个流,因为输出我有压缩流,但它不等于输入压缩流和它们不等于长度。我做错了什么?这是我的代码的一部分:

     size_t outsize = (streamend - streamstart) * 10;
            char* output = new char[outsize]; ZeroMemory(output, outsize);

            z_stream zstrm; ZeroMemory(&zstrm, sizeof(zstrm));
            zstrm.avail_in = streamend - streamstart + 1;
            zstrm.avail_out = outsize;
            zstrm.next_in = (Bytef*)(buffer + streamstart);//block of date to infalte 
            zstrm.next_out = (Bytef*)output; 

            int rsti = inflateInit(&zstrm);
            if (rsti == Z_OK)
            {
                int rst2 = inflate(&zstrm, Z_FINISH);
                if (rst2 >= 0)
                {
                    cout << output << endl;//inflated data
                }
            }

            char* deflate_output = new char[streamend - streamstart];           
            ZeroMemory(deflate_output, streamend - streamstart);
            z_stream d_zstrm; ZeroMemory(&d_zstrm, sizeof(d_zstrm));

            d_zstrm.avail_in = (uInt) (strlen(output)+1);
            d_zstrm.avail_out = (uInt) (streamend - streamstart);
            d_zstrm.next_in = (Bytef*)(output);
            d_zstrm.next_out = (Bytef*)(deflate_output);
            int rsti1 = deflateInit(&d_zstrm, Z_DEFAULT_COMPRESSION);

            if (rsti1 == Z_OK)
            {
                int rst22 = deflate(&d_zstrm, Z_FINISH);
                out << deflate_output << endl << "**********************" << endl;
//I try to write deflated stream to file
                printf("New size of stream: %lu\n", (char*)d_zstrm.next_out - deflate_output);
            }

1 个答案:

答案 0 :(得分:3)

没有错。给定的未压缩流没有唯一的压缩流。所需要的只是减压能够准确地回复压缩的内容(因此&#34;无损&#34;)。

它可能只是由不同的压缩参数,不同的压缩代码,甚至是相同压缩代码的不同版本引起的。

如果您无法重现原始压缩数据,那又如何呢?重要的是,您可以制作一个可以解压缩并具有您想要的内容的有效PDF文件。