无法从Perl中的pdf中读取文本

时间:2011-12-23 01:58:36

标签: perl pdf

我正在尝试将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页”,这是本文档中正确的页数。

下一个print语句不返回任何可读内容。以下是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。

非常感谢任何指导。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

进一步研究PDF,我发现它还使用嵌入式字体子集,并使用自定义编码。即使CAM :: PDF处理压缩,自定义编码也可能正在甩掉它。这可能有所帮助:Web page from a software company, describing the problem