我正在尝试使用 Perl 从 PDF 文件中提取文本。我一直在使用pdftotext.exe
命令行(即使用 Perlsystem
函数)从 PDF 文件中提取文本,这种方法效果很好。
问题是我们在 PDF 文件中有像 α、β 和其他特殊字符这样的符号,这些符号没有显示在生成的 txt 文件中。文本中也随机添加了一些额外的空格。
是否有更好、更可靠的方法从 PDF 文件中提取文本,使文本包含所有符号,如 α、β 等,并且文本与 PDF 中的文本完全匹配(即没有多余的空格)?
这些模块您可以从 pdf 中提取文本
来自 CPAN
my $pdf = CAM::PDF->new($filename);
my $pageone_tree = $pdf->getPageContentTree(1);
print CAM::PDF::PageText->render($pageone_tree);
此模块尝试从 PDF 页面中提取连续文本。这不是一个稳健的过程,因为 PDF 文本以任意顺序以图形方式布局。该模块使用一些启发式方法来尝试猜测哪些文本与其他文本相邻,但可能很容易被下标、非水平文本、字体更改、表单字段等愚弄。
除了所有这些免责声明之外,它对于从简单的 PDF 文件中快速转储文本很有用。
您可能永远无法为您的问题找到合适的解决方案。PDF 格式可以将文本编码为应用字体的 ASCII 值,也可以将其编码为位图。如果创建 PDF 的工具决定将特殊字符编码为位图,那么您将不走运(当然,除非您想使用 OCR 解决方案)。
我不是 Perl 用户,但我想你会很难找到比 pdftotext 更好的自由文本提取器。
pdftotext 通常可以很好地识别非 ASCII 字符,是否可以正常提取它们,但是您用于查看文本文件的应用程序未使用正确的编码?如果 windows 上的 pdftoetxt 和我的 linux 系统上的一样,那么它默认导出为 utf-8。
有getpdftext.pl;CAM::PDF的一部分。
好吧,我尝试了 2-3 个 perl 模块,例如 CAM::PDF、API2,但问题仍然存在!我正在解析一个包含主页的 pdf 文件。Cam 或 API2 可以很好地解析纯文本。但是,他们无法解析代码片段[代码片段通常采用与纯文本不同的字体和编码]。
詹姆斯·希利是正确的。在尝试了 CAM::PDF 和 PDF::API2(其中我在阅读文本方面取得了一些成功)之后,下载 pdftotext 对我的许多实现都非常有效。
如果在 Windows 上去这里下载 xpdf 预编译的二进制文件: http ://www.foolabs.com/xpdf/download.html
然后,如果您需要在 perl 使用系统中运行它,例如:system("C:\Utilities\xpdfbin-win-3.04\bin64\pdftotext.exe $saveName");
其中 $saveName 是 PDF 文件的完整路径。
希望这会给您留下一个可以在 perl 中打开和解析的文本文件。
我尝试了这个模块,它适用于 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";
看看PDFBox。它是一个库,但我认为它还带有一些工具来进行文本提取。