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

gkl3eglg  于 2023-01-01  发布在  PHP
关注(0)|答案(5)|浏览(250)

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

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”流。
谢谢你!

o75abkj4

o75abkj41#

既然你没有告诉你是否需要访问一个解压缩流或如果你需要所有的流解压缩,我会建议你一个简单的命令行工具,这样做在一个去完整的PDF:杰·伯肯比尔特的《X战警》

示例命令行:

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

out.pdf可以在文本编辑器中检查(只有嵌入的ICC配置文件、图像和字体仍然可以是二进制的)。
qpdf还将自动对对象重新排序,并以规范化的方式显示PDF语法(并在注解中告诉您解压缩对象的原始对象ID是什么)。
如果您需要再次重新压缩文件(可能是在编辑之后),只需运行以下命令:

qpdf out-edited.pdf out-recompressed.pdf

(You可能会看到一些警告消息,告知实用程序正在尝试修复损坏的文件...)
qpdf是多平台和available from Sourceforge

mlmc2os5

mlmc2os52#

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

j7dteeu8

j7dteeu83#

早该如此了,但有人可能会发现它很有帮助。在这种情况下:〈〈/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值和列数。最好使用PyPDF 2。

zzwlnbp8

zzwlnbp84#

我只是用

import de.intarsys.pdf.filter.FlateFilter;

从jpod / source forge和它的工作很好

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

字节直接来自pdf文件

7eumitmz

7eumitmz5#

我想补充一个更完整的答案,因为我也面临同样的问题。
我在一个成熟的PHP PDF解析库的源代码中找到了答案:FPDI公司。
https://github.com/flagshipcompany/fpdf/blob/master/fpdi/src/pdf_parser.php#L878
我发现有多种方法可以对流进行编码:“/扁平解码”、“/LZW解码”、“/ASCII 85解码”、“/ASCII十六进制解码”。
对于FlateDecodegzuncompress原生PHP函数是关键。对于其他函数,FPDI源代码包含解码器,您可以在项目中重复使用。

相关问题