我正在尝试使用 Perl 从 PDF 文件中提取文本。我一直在命令行中使用
pdftotext.exe
(即使用 Perl system
函数)从 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 文件中快速转储文本非常有用。
我不是 Perl 用户,但我想你会很难找到比 pdftotext 更好的免费文本提取器。
pdftotext 通常可以很好地识别非 ASCII 字符,是否有可能可以正常提取它们,但您用来查看文本文件的应用程序未使用正确的编码?如果windows上的pdftoetxt和我的linux系统上的一样,那么它默认导出为utf-8。
您的问题可能永远找不到合适的解决方案。 PDF 格式可以将文本编码为应用字体的 ASCII 值,也可以将其编码为位图。如果创建 PDF 的工具决定将特殊字符编码为位图,那么您将不走运(当然,除非您想使用 OCR 解决方案)。
有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 使用系统中运行它,例如: 系统(“C:\ Utilities \ xpdfbin-win-3.04 in64 \ 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";
我用
尝试了不同的 PDF 文件PDF::API2
CAM::PDF
CAM::PDF::PageText
而且它们都不可靠,我发现从 PDF 文件中解析文本的最佳方法是使用旧的 poppler 的 pdftotext 命令行实用程序。你可以
pdftotext "~/your_pdf.pdf -
然后从 Perl 读取 stdout 并解析它。 pdftotext 非常可靠,能够读取我必须测试的所有 PDF 中的文本
看看PDFBox。它是一个库,但我认为它还附带了一些用于文本提取的工具。