【发布时间】:2015-08-17 19:51:46
【问题描述】:
我正在尝试使用找到的代码 here 从 PDF 文件中提取文本。该代码使用zlib 库。
AFAICT 该程序通过在 pdf 文件中的文本“stream”和“endstream”出现之间查找内存块来工作。然后这些块被 zlib 膨胀。
该代码在一个示例 pdf 文档上完美运行,但在另一个示例中,zlib 的 inflate() 函数似乎在每次调用时都返回 -3 (Z_DATA_ERROR)。
我注意到,失败的 pdf 文件被设置为在 Adobe 阅读器中打开时没有“复制”选项。这可能与inflate() 错误有关吗?...如果是,有没有办法解决这个问题?
下面的代码 sn-p - 见 cmets
//Now use zlib to inflate:
z_stream zstrm; ZeroMemory(&zstrm, sizeof(zstrm));
zstrm.avail_in = streamend - streamstart + 1;
zstrm.avail_out = outsize;
zstrm.next_in = (Bytef*)(buffer + streamstart);
zstrm.next_out = (Bytef*)output;
int rsti = inflateInit(&zstrm);
if (rsti == Z_OK)
{
int rst2 = inflate (&zstrm, Z_FINISH); // HERE IT RETURNS -3
if (rst2 >= 0)
{
//Ok, got something, extract the text:
size_t totout = zstrm.total_out;
ProcessOutput(fileo, output, totout);
}
}
编辑:我通过名为zamzar 的在线 pdf 到文本转换器测试了从“加密”pdf 中提取文本,结果文本文件非常完美。因此,要么 zamzar 有一些超级骗子解密系统......或者它可能不是很困难。
编辑:刚刚发现A-pdf也转换成文字没有问题。
【问题讨论】:
-
导致错误的示例文档会有所帮助。使用调试器找出错误所在会有所帮助。
-
您引用的 codeproject 中的代码充满了假设,这些假设有时正确,有时不正确。 没有“复制”选项这一事实可能表明 PDF 已加密以应用限制。它看起来不像 codeproject 代码尝试解密。所以 zlib 试图膨胀显然无法工作的加密数据。正确的方法是使用适当的 PDF 库。
-
其中一些库的安装和运行似乎非常复杂。我不愿意在没有任何迹象表明它们工作的可能性的情况下完成所有这些工作。
标签: c++ pdf visual-studio-2008 zlib