【问题标题】:Handling uncompressed stream处理未压缩的流
【发布时间】:2018-09-30 01:48:00
【问题描述】:

我最近刚坐下来,尝试编写一些可以读取 .pdf 文件的代码 sn-p,获取某些流(或者在这种情况下只有一个),解压缩它,然后...尝试输出可读的文本,所以基本上是 ASCII。 从流中的字典我知道它的过滤器是 DecodeFlate。根据手册,这意味着通过 zlib 压缩。我在 stackoverflow 上找到了一个示例,其中提到应该使用 gzuncompress 来恢复它。 所以,这是我的代码 sn-p。

$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

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

提前致谢

【问题讨论】:

  • 您需要一个可以将 pdf 文件转换为文本的库,它可以为您完成这项工作。例如,查看at this
  • 经过进一步检查(并以不同于普通网站的方式查看文本):括号 [] 内的部分应该是页面上显示的文本。问题仍然是我如何将其解码为可读的。
  • 只是想确定我是否正确理解您是在尝试将 pdf 转换为 txt 吗?
  • 有点,是的。第一个前提是简单地从 pdf 中读取某些数据。但是由于我没有权限/访问请求来自的服务器,所以很遗憾我不能使用库。

标签: php zlib deflate compression


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    相关资源
    最近更新 更多