如何使用 Perl 从 PDF 文件中提取文本?

问题描述 投票:0回答:9

我正在尝试使用 Perl 从 PDF 文件中提取文本。我一直在命令行中使用

pdftotext.exe
(即使用 Perl
system
函数)从 PDF 文件中提取文本,这种方法效果很好。

问题是 PDF 文件中存在诸如 α、β 和其他特殊字符的符号,这些符号未在生成的 txt 文件中显示。文本中还随机添加了一些额外的空格。

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

perl pdf text extract
9个回答
23
投票

这些模块您可以实现从pdf中提取文本

PDF::API2

CAM::PDF

CAM::PDF::页面文本

来自 CPAN

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

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

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


6
投票

我不是 Perl 用户,但我想你会很难找到比 pdftotext 更好的免费文本提取器。

pdftotext 通常可以很好地识别非 ASCII 字符,是否有可能可以正常提取它们,但您用来查看文本文件的应用程序未使用正确的编码?如果windows上的pdftoetxt和我的linux系统上的一样,那么它默认导出为utf-8。


6
投票

您的问题可能永远找不到合适的解决方案。 PDF 格式可以将文本编码为应用字体的 ASCII 值,也可以将其编码为位图。如果创建 PDF 的工具决定将特殊字符编码为位图,那么您将不走运(当然,除非您想使用 OCR 解决方案)。


3
投票

getpdftext.plCAM::PDF的一部分。


3
投票

好吧,我尝试了 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 使用系统中运行它,例如: 系统(“C:\ Utilities \ xpdfbin-win-3.04 in64 \ 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 并解析它。 pdftotext 非常可靠,能够读取我必须测试的所有 PDF 中的文本


-2
投票

看看PDFBox。它是一个库,但我认为它还附带了一些用于文本提取的工具。

© www.soinside.com 2019 - 2024. All rights reserved.