使用 zlib C++ 为 PDF 压缩和膨胀
Deflate and inflate for PDF, using zlib C++
我正在尝试实现 "zlib.h" deflate 和 inflate 函数来压缩和解压缩 PDF 文件中的流。
输入:来自 PDF 文件的压缩流。我实现了 inflate 函数——没关系,我有未压缩的流,之后我尝试用 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);
}
没有错。对于给定的未压缩流,没有唯一的压缩流。所需要的只是解压缩后准确地返回压缩的内容(因此"lossless")。
可能只是压缩参数不同,压缩代码不同,甚至是同一个压缩代码的不同版本造成的。
如果你不能重现原始的压缩数据,那又怎样?重要的是您可以制作一个有效的 PDF 文件,该文件可以解压并包含您想要的内容。
我正在尝试实现 "zlib.h" deflate 和 inflate 函数来压缩和解压缩 PDF 文件中的流。 输入:来自 PDF 文件的压缩流。我实现了 inflate 函数——没关系,我有未压缩的流,之后我尝试用 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);
}
没有错。对于给定的未压缩流,没有唯一的压缩流。所需要的只是解压缩后准确地返回压缩的内容(因此"lossless")。
可能只是压缩参数不同,压缩代码不同,甚至是同一个压缩代码的不同版本造成的。
如果你不能重现原始的压缩数据,那又怎样?重要的是您可以制作一个有效的 PDF 文件,该文件可以解压并包含您想要的内容。