我正在使用Perl从PDF文件中提取文本。我一直在使用命令行中的pdftotext.exe
(即使用Perl的system
函数)来提取PDF文件中的文本,这种方法很有效。
问题在于,PDF文件中有类似于α,β和其他特殊字符的符号,这些符号在生成的txt文件中无法显示。此外,文本中会随机添加一些额外的空格。
有没有更好、更可靠的方法来从PDF文件中提取文本,使文本包括所有的符号,例如α,β等,并且文本与PDF中的文本完全匹配(即不包含额外的空格)?
我正在使用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解决方案,当然)。
我尝试了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,例如: 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";
PDF::API2
CAM::PDF
CAM::PDF::PageText
pdftotext ~/your_pdf.pdf -
- at the end means that pdftotext will output content of PDF file to stdout