我该如何在Perl中从PDF文件中提取文本?

24

我正在使用Perl从PDF文件中提取文本。我一直在使用命令行中的pdftotext.exe(即使用Perl的system函数)来提取PDF文件中的文本,这种方法很有效。

问题在于,PDF文件中有类似于α,β和其他特殊字符的符号,这些符号在生成的txt文件中无法显示。此外,文本中会随机添加一些额外的空格。

有没有更好、更可靠的方法来从PDF文件中提取文本,使文本包括所有的符号,例如α,β等,并且文本与PDF中的文本完全匹配(即不包含额外的空格)?


大家好,感谢你们的建议。我正在使用xpdf提取pdf文件中的文本,并使用-raw选项删除那些不需要的空格。但现在我们想将pdf文件转换为html文件,以提取带有文本的html格式标记,如粗体、斜体等。我尝试使用pdf2html进行转换,但发现它不可靠,因为一些标记,如上标和下标,会丢失。现在,我们正在使用Acrobat Reader将pdf文件保存为html文件,这样就可以得到所有的html格式标记了。有没有办法在perl中使用Acrobat Reader将多个pdf文件保存为html文件?谢谢。 - Pawan Rao
2
Acrobat Professional 允许您进行批处理作业。我意识到您似乎想找一种免费的方法,但是,由于您在很大程度上依赖于 PDF 提取,此时获取单个许可证将为您节省大量时间和金钱。 - nlucaroni
9个回答

23

你可以使用以下模块从PDF文件中提取文本:

PDF::API2

CAM::PDF

CAM::PDF::PageText

这些模块可以从CPAN获取。

   my $pdf = CAM::PDF->new($filename);
   my $pageone_tree = $pdf->getPageContentTree(1);
   print CAM::PDF::PageText->render($pageone_tree);

该模块旨在从PDF页面中提取连续文本。这不是一个强大的过程,因为PDF文本以任意顺序进行图形布局。该模块使用一些启发式方法来尝试猜测哪些文本与其他文本相邻,但很容易被下标、非水平文本、字体变化、表单字段等所欺骗。

所有这些免责声明都不管,它对于从简单的PDF文件快速转储文本非常有用。


13
我是CAM::PDF的作者,我同意免责声明。我凭着一时兴起构建了文本提取功能,结果比我预期的要困难得多。 - Chris Dolan

7

我不是Perl用户,但我认为你很难找到比pdftotext更好的免费文本提取工具。

pdftotext通常可以很好地识别非ASCII字符。它是否可能已正确提取这些字符,但你用来查看文本文件的应用程序没有使用正确的编码方式呢?如果Windows上的pdftoetxt与我的Linux系统上的相同,则默认导出为utf-8。


5

您可能无法得到适当的解决方案。PDF格式可以将文本编码为应用字体的ASCII值,也可以将其编码为位图。如果创建您的PDF的工具决定将特殊字符编码为位图,则您将会很不幸(除非您想使用OCR解决方案,当然)。


9
它比这更糟糕——文本不需要按阅读顺序排列在页面上。它不需要直线排列。为Acrobat 1.0编写一个简单的查找单词命令用了我5个月时间,即使在与创建所有支持库和设计格式的人在相邻办公室的情况下也是如此。提取文本是该问题的一个子集。 - plinth
现在,使用位图或矢量图形来表示字母而不是字符代码,真的是一种病态的做法。文本未按阅读顺序排列是很正常的,但通常结果是可以理解的。 - Charles Stewart

3

2
@Chris Dolan 这也不是那么糟糕的事情啦 ;-) - Sinan Ünür

2

我尝试了2-3个perl模块,如CAM::PDF、API2,但问题仍然存在!我正在解析一个包含主要页面的pdf文件。Cam或API2可以很好地解析纯文本。然而,它们无法解析代码片段[代码片段通常使用不同的字体和编码]。


1

詹姆斯·希利是正确的。在尝试了CAM::PDF和PDF::API2之后,前者我已经成功地读取了一些文本,但下载pdftotext对于我的许多实现来说非常有效。

如果在Windows上,请转到此处并下载xpdf预编译二进制文件: http://www.foolabs.com/xpdf/download.html

然后,如果需要在perl中运行此程序,请使用system,例如: system("C:\Utilities\xpdfbin-win-3.04\bin64\pdftotext.exe $saveName");

其中$saveName是PDF文件的完整路径。

这样做希望会给你留下一个文本文件,你可以在perl中打开和解析它。


0

我尝试了这个模块,对于 PDF 文件中的特殊字符效果很好。

!/usr/bin/perl
use strict;
use warnings;
use PDF::OCR::Thorough;

my $filename = "pdf.pdf";

my $pdf = PDF::OCR::Thorough->new($filename);
my $text = $pdf->get_text();
print "$text";

0
我在不同的PDF文件上进行了实验。
PDF::API2
CAM::PDF
CAM::PDF::PageText

他们都不可靠,我发现从PDF文件中解析文本的最佳方法是使用旧版的poppler的pdftotext命令行实用程序。你可以。
pdftotext ~/your_pdf.pdf - 

然后从Perl中读取stdout并解析它。
 - at the end means that pdftotext will output content of PDF file to stdout

我发现pdftotext非常可靠,能够从我测试的所有PDF中读取文本。

-2

看看PDFBox。它是一个库,但我认为它也带有一些提取文本的工具。


它支持Perl吗? - chinna_82

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接