【问题标题】:Trouble reading text from a pdf in Perl在 Perl 中读取 pdf 文本时遇到问题
【发布时间】:2012-01-26 13:06:51
【问题描述】:

我正在尝试将 pdf 文件的文本内容读入 Perl 变量。从其他 SO 问题/答案中,我感觉到我需要使用 CAM::PDF。这是我的代码:

#!/usr/bin/perl -w

use CAM::PDF;
my $pdf = CAM::PDF->new('1950-01-01.pdf');
print $pdf->numPages(), " pages\n\n";

my $text = $pdf->getPageText(1);
print $text, "\n";

我尝试在this pdf file 上运行它。 Perl 没有报告错误。第一个打印语句有效;它打印“2 页”,这是本文档中正确的页数。

下一个打印语句不返回任何可读的内容。以下是 Emacs 中的输出:

2 pages

^A^B^C^D^E^C^F^D^G^H
^D^A^K^L^C^M^D^N^C^M^O^D^P^C^Q^Q^C      ^D^R^K^M^O^D ^A^B^C^D^E
^F^G^G^H^E
^K^L
^M^N^E^O^P^E^O^Q^R^S^E
.... more lines with similar codes ....

我可以做些什么来完成这项工作吗?我不太了解pdf文件,但我认为因为我可以使用Acrobat轻松复制和粘贴PDF文件中的文本,所以它必须被识别为文本而不是图像,所以我希望这意味着我可以提取它使用 Perl。

任何指导将不胜感激。

【问题讨论】:

    标签: perl pdf


    【解决方案1】:

    我很确定问题不在于您的 perl 代码,而在于 PDF 文件。我在自己的一个 PDF 文件上运行了相同的脚本,它运行良好。

    【讨论】:

      【解决方案2】:

      PDF 可以有不同种类的内容。例如,PDF 可能根本没有任何可读文本,只有位图和图形内容。您链接到的 PDF 中包含压缩数据。使用文本编辑器打开它,您会看到内容位于“/Filter/FlateDecode”块中。也许CAM::PDF 不支持。 Google FlateDecode 获取一些想法。

      进一步查看该 PDF,我发现它还使用嵌入的字体子集,并带有自定义编码。即使 CAM::PDF 处理压缩,自定义编码也可能会导致它失败。这可能会有所帮助:Web page from a software company, describing the problem

      【讨论】:

      • 好的。如果我在 Acrobat 中打开文件并将其另存为文本文件,它会正确导出文本。因此,我认为必须有某种方法可以用 Perl 提取它。但是 Acrobat 理解编码而 CAM::PDF 不理解的区别是什么?
      • 是的,我相信就是这样。请参阅上面我超链接的页面,它描述了子集编码的样子。除了渲染字符和进行 OCR 之外,没有任何保证可以恢复字符的方法(尽管一些启发式方法可能会起作用,如标题为“弄清楚”的部分中所述)。
      猜你喜欢
      • 1970-01-01
      • 2012-09-28
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 2013-04-10
      相关资源
      最近更新 更多