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

2022-08-30 11:00:55

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

    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”流。

谢谢!


答案 1

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


答案 2
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()- 解决方案


推荐