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

Rub*_*mov 34 php pdf decode

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

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

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

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

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

谢谢!

Kur*_*fle 54

既然你没有告诉你是否只需要访问一个解压缩的流,或者你需要解压缩所有流,我会建议你一个简单的命令行工具,它可以一次完成整个PDF:Jay Berkenbilt的qpdf.

示例命令行:

 qpdf --qdf --object-streams=disable in.pdf out.pdf
Run Code Online (Sandbox Code Playgroud)

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

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

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

 qpdf out-edited.pdf out-recompressed.pdf
Run Code Online (Sandbox Code Playgroud)

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

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


Rub*_*mov 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
Run Code Online (Sandbox Code Playgroud)

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

gzuncompress() - 解决方案


Bel*_*ial 5

姗姗来迟,但有人可能会发现它有用.在这种情况下:<</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
Run Code Online (Sandbox Code Playgroud)

但是,如果在PDF对象中有/ DecodeParms,则事情会变得复杂.您将需要/ Predictor值和列号.更好地使用PyPDF2.

  • 问题是要求PHP,这个解决方案建议使用Python.这不太合适.无论如何,这可能对你而言显而易见,但并非所有其他人:你需要传递`stream`和`endstream`**之间的所有东西,除了**前导和尾随EOL标记. (4认同)