【问题标题】:How can I extract text from a PDF file in Perl?如何在 Perl 中从 PDF 文件中提取文本?
【发布时间】:2010-11-11 08:10:57
【问题描述】:

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

问题是我们在 PDF 文件中有像 α、β 和其他特殊字符这样的符号,这些符号没有显示在生成的 txt 文件中。文本中也随机添加了一些额外的空格。

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

【问题讨论】:

  • 大家好,感谢您的建议。我正在使用 xpdf 从 pdf 文件中提取文本,并使用 -raw 选项删除那些不需要的空格。但是现在我们想将 pdf 文件转换为 html 文件,以便提取带有文本的 html 格式标签,如粗斜体等。我尝试为此使用 pdf2html,但发现它不可靠,因为缺少 sup 和 sub 等标签。我们现在使用 Acrobat Reader 将 pdf 文件保存为 html 文件,它为我们提供了所有 html 格式标记。有没有办法在 perl 中使用 Acrobat reader 将多个 pdf 文件保存为 html 文件?谢谢。
  • Acrobat Professional 允许您进行批处理作业。我意识到您似乎想要一个免费的出路,但是由于您严重依赖 pdf 提取,因此获得一个许可证可以为您节省大量时间和金钱。

标签: perl pdf text extract


【解决方案1】:

这些模块你可以从 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 文件中快速转储文本很有用。

【讨论】:

  • 我是 CAM::PDF 作者,我同意免责声明。我一时兴起构建了文本提取,结果比我预期的要困难得多。
【解决方案2】:

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

【讨论】:

  • 比这更糟糕 - 文本不需要按阅读顺序排列在页面上。它不需要直线布置。为 Acrobat 1.0 编写一个简单的查找单词命令花了我 5 个月的时间,这是与创建所有支持库并在相邻办公室设计格式的人一起完成的。提取文本是该问题的一个子集。
  • 字母不是用字符代码表示,而是用位图或矢量图形表示,这些天真的很病态。文本没有按阅读顺序排列是正常的,但通常结果是可以理解的。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    getpdftext.pl; CAM::PDF的一部分。

    【讨论】:

    • @Chris Dolan 也没有那么不好 ;-)
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      詹姆斯·希利是正确的。在尝试了 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 中打开和解析的文本文件。

      【讨论】:

        【解决方案7】:

        我试过这个模块,它适用于 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";
        

        【讨论】:

          【解决方案8】:

          看看PDFBox。它是一个库,但我认为它还附带一些工具来进行文本提取。

          【讨论】:

          • 是否支持perl..?
          猜你喜欢
          • 2015-03-20
          • 2016-04-22
          • 2011-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-10
          • 2019-12-05
          相关资源
          最近更新 更多