处理未压缩的流

时间:2018-04-19 14:01:38

标签: php zlib deflate compression

我刚刚坐下来试着写一小段代码,这些代码可以在.pdf文件中读取,获取某些流(或者在这种情况下只有一个),解压缩它并...尝试发出可读文本,所以基本上用ASCII。 从流中的字典我知道它的过滤器是DecodeFlate。通过手册,这意味着通过zlib压缩。我在stackoverflow上找到了一个示例,其中提到应该使用gzuncompress来还原它。 所以,这是我的代码片段。

$file = ('mypdf.pdf');
$data = fopen($file, "rb");
$size = filesize($file);
$contents = fread($data,$size);
fclose($data);
// irrelevant code finding a certain xx 0 obj and setting start_pos to it
$start_pos = strpos($contents,'stream', $start_pos);
$end_pos = strpos($contents,'endstream', $start_pos);
$start_pos = $start_pos +8;
$end_pos = $end_pos -2;
$substring = substr($contents, $start_pos, $end_pos);
$result = gzuncompress($substring);
echo $substring;

直到这一点,一切正常,我想。找到该流,其长度与其序列中提到的相同。 gzuncompress也有效。然而,在这一点上,我不知道如何继续。 我得到了以下结果:

q 1 0 0 -1 0 841.889 cm q 1 0 0 1 70.866 28.346 cm 0 g /P <> BDC BT /F21 8 Tf 1 0 0 -1 0 19.17900085 Tm [<002800090016001000010005001000110001001A00120006000500130010000A00140009000A00140011001F>] TJ ET EMC /P <> BDC BT /F21 8 Tf 1 0 0 -1 0 28.77899933 Tm

等等,很多[&lt; ....&gt;]和其他东西。从现在开始如何继续,我一无所知。或者如果可能的话。

提前致谢

1 个答案:

答案 0 :(得分:0)

随着我对它的深入了解,我注意到了一些关于这些pdf结构的事情。 由于它们基本上都是一样的,我可以稍微利用它。 只有2种字体,F21和F22。两者都在某个对象之前定义并应用于它直到文档结束。 对于初始启动,我必须解压缩流,检查解码部分中是否存在CIDMap。如果是,请构建CMap。 然后我可以遍历包含我想要的数据的对象,并通过CMap将Hex值转换为相应的UTF8,我应该完成。