用PHP中的/ Filter / FlateDecode PDF流提取数据

时间:2012-07-31 00:08:51

标签: php pdf decode

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

    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参考文献v 1.7,(六版)中,在第67页上,我发现/ FlateDecode过滤器的描述为: ...解压缩使用zlib / deflate压缩方法编码的数据,再现原始文本或二进制数据

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

谢谢!

4 个答案:

答案 0 :(得分:51)

由于您没有告诉您是否只需要访问一个解压缩的流,或者您需要解压缩所有流,我建议您使用一个简单的命令行工具,它可以一次性完成完整的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是多平台的available from Sourceforge

答案 1 :(得分:15)

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
铃儿响起! Jingle铃声!...

gzuncompress() - 解决方案

答案 2 :(得分:5)

姗姗来迟,但有人可能觉得它很有帮助。在这种情况下: &LT;&LT; /长度1242 /滤波器/ FlateDecode&gt;&gt;你所需要的就是将孤立的二进制字符串(基本上是&#34; stream&#34;和&#34; endstream&#34;之间的所有内容)传递给zlib.decompress:

@{
var jsonSerializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() };
<text>
    <script type="text/javascript">
        var someJsObjectOrArray = @Html.Raw(JsonConvert.SerializeObject(Model.someDotNetObjectOrArray, jsonSerializerSettings)));
    </script>
</text>
}

但是,如果你的PDF对象中的/ DecodeParms变得复杂。您将需要/ Predictor值和列号。最好使用PyPDF2。

答案 3 :(得分:-1)

我刚用过

import de.intarsys.pdf.filter.FlateFilter;

来自jpod / source forge 它运作良好

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

字节直接来自pdf文件