44

我无法解密流中的数据,例如:

    56 0 obj 
    << /Length 1242 /Filter /FlateDecode >>
    stream
    x]êΩnƒ Ñ{ûbÀKq¬æ\âê¢....(whole binary is omitted)
    endstream
    endobj

我尝试隔离x]êΩnƒ Ñ{ûbÀKq¬æ\âê¢....文件和二进制字符串中的二进制内容()。解码功能gzinflate($encripted_data)向我发送解码错误,我认为这是因为编码内容没有“放气”左右。

在 PDF Reference v 1.7,(六版)的第 67 页,我发现 /FlateDecode 过滤器的描述为:...解压缩使用 zlib/deflate 压缩方法编码的数据,再现原始文本或二进制数据

我需要真正的原始解决方案,也就是 php 函数或/和算法如何处理这个“\FlateDecoded”流。

谢谢你!

4

4 回答 4

71

由于您没有告诉您是只需要访问一个解压缩流还是需要解压所有流,所以我建议您使用一个简单的命令行工具,它可以一次性完成完整的 PDF:Jay Berkenbilt 的qpdf.

示例命令行:

 qpdf --qdf --object-streams=disable in.pdf out.pdf

out.pdf然后可以在文本编辑器中检查(只有嵌入的 ICC 配置文件、图像和字体仍然可以是二进制的)。

qpdf还将自动重新排序对象并以标准化方式显示 PDF 语法(并在评论中告诉您解压缩对象的原始对象 ID 是什么)。

如果您需要再次重新压缩文件(可能在您编辑后),只需运行以下命令:

 qpdf out-edited.pdf out-recompressed.pdf

(您可能会看到一些警告消息,告知该实用程序正在尝试修复损坏的文件......)

qpdf是多平台的,可从 Sourceforge 获得

于 2012-07-31T01:55:22.167 回答
18
header('Content-Type: text');           // I going to download the result of decoding
$n = "binary_file.bin";                 // decoded part in file in a directory
$f = @fopen($n, "rb");                  // now file is mine
$c = fread($f, filesize($n));           // now I know all about it 
$u = @gzuncompress($c);                 // function, exactly fits for this /FlateDecode filter
$out = fopen("php://output", "wb");     // ready to output anywhere
fwrite($out, $u);                       // output to downloadable file

铃儿响!铃儿响叮当!...

gzuncompress()- 解决方案

于 2012-07-31T02:48:37.127 回答
7

姗姗来迟,但有人可能会觉得它有帮助。在这种情况下: << /Length 1242 /Filter /FlateDecode >> 您只需将隔离的二进制字符串(基本上是“stream”和“endstream”之间的所有内容)传递给zlib.decompress:

import zlib
stream = b"êΩnƒ Ñ{ûbÀKq¬æ\âê"  # binary stream here
data = zlib.decompress(stream) # Here you have your clean decompressed stream

但是,如果您的 PDF 对象中有/DecodeParms,事情就会变得复杂。您将需要 /Predictor 值和列号。为此最好使用 PyPDF2。

于 2017-01-13T15:20:17.557 回答
-1

我刚用

import de.intarsys.pdf.filter.FlateFilter;

来自 jpod / source forge,它运行良好

FlateFilter filter = new FlateFilter(null);
byte[] decoded = filter.decode(bytes, start, end - start);

字节直接来自pdf文件

于 2014-11-27T15:57:25.187 回答