如何从 PDF 中提取文本?[已结束]

How to extract text from a PDF? [closed]

提问人:Budda007 提问时间:9/6/2010 最后编辑:JonathanBudda007 更新时间:9/29/2023 访问量:302524

问:


我们不允许向读者、工具、软件库等寻求推荐的问题。您可以编辑问题,以便用事实和引文来回答。

8年前关闭。

社区去年审查了是否重新讨论这个问题,并关闭了它:

原始关闭原因未解决

任何人都可以推荐一个库/API 来从 PDF 中提取文本和图像吗? 我们需要能够获取包含在文档的预先已知区域中的文本,因此 API 需要为我们提供页面上每个元素的位置信息。

我们希望该数据以 或 格式输出。我们目前正在研究 PdfTextStream,它看起来不错,但想听听其他人的经验和建议。xmljson

是否有以编程方式从 pdf 中提取文本的替代方案(商业或免费)?

PDF Ghostscript 提取 文本提取

评论

0赞 yms 5/3/2013
相关问题:从 PDF 中提取带有坐标和大小的图像和文字
2赞 Alex R 10/25/2015
对于那些需要非常简单的东西(没有位置信息)的人来说,这个perl正则表达式可能就足够了:.它只是查找 Tj/TJ 运算符,它表示 PDF 中的所有普通文本。/^\s*\[?\((.*?)\)\]?\s*T[Jj]/mg
1赞 FaisalAhmed 3/17/2017
使用 TomRoush PdfBox 库,这在 android 上效果很好
1赞 Dalija Prasnikar 10/26/2022
库建议是 Stack Overflow 的题外话。此类问题可能是 softwarerecs.stackexchange.com 上的主题 在询问之前,请阅读他们的帮助中心并寻求指导。

答:

3赞 Kurt Pfeifle 9/7/2010 #1

我目前能想到的最好的东西(在“简单”工具列表中)是 Ghostscript(当前版本是 v.8.71)和 PostScript 实用程序。Ghostscript 将其放在其子目录中。试试这个(在 Windows 上):ps2ascii.pslib

gswin32c.exe ^
   -q ^
   -sFONTPATH=c:/windows/fonts ^
   -dNODISPLAY ^
   -dSAFER ^
   -dDELAYBIND ^
   -dWRITESYSTEMDICT ^
   -dCOMPLEX ^
   -f ps2ascii.ps ^
   -dFirstPage=3 ^
   -dLastPage=7 ^
   input.pdf ^
   -dQUIET ^
   -c quit

此命令处理第 3-7 页。阅读文件本身中的注释,看看“奇怪”的数字和其他信息是什么意思(它们表示字符串、位置、宽度、颜色、图片、矩形、字体和分页符......要获得“简单”文本输出,请将该部分替换为 。input.pdfps2ascii.ps-dCOMPLEX-dSIMPLE

评论

2赞 userx 9/9/2010
正如您猜到的那样,这只输出 ASCII 测试。虽然免费,但对于您计划使用英语以外的语言的软件来说,这不是一个很好的选择。
3赞 Kurt Pfeifle 9/10/2010
@userx:正如你所猜到的,这是自由软件:因此源代码可用。可扩展以支持非 ASCII...
0赞 Kurt Pfeifle 9/16/2010
@userx:今天我发现了“TET”,这是 pdflib.com 的文本提取工具包。看看我的另一个答案。
0赞 Clint Pachl 4/18/2020
来自 Ghostscript 9.07 的 ps2ascii 在我的 OpenBSD 系统上运行得很好。我刚刚将 526 页的 PDF 转换为纯文本。现在我可以轻松地 grep 和提取笔记的文本。我使用了简单的命令。如果您的文档主要是 ASCII,那么您很幸运。ps2ascii book.pdf notes.txt
1赞 Andrew Cash 9/7/2010 #2

QuickPDF 似乎是一个合理的库,应该以合理的价格做你想做的事。

http://www.quickpdflibrary.com/ - 他们有 30 天的试用期。

31赞 Kurt Pfeifle 9/16/2010 #3

从今天开始,我就知道了:从 PDF 中提取文本的最佳方式是 TET,即文本提取工具包。TET 是 PDFlib.com 系列产品的一部分。

PDFlib.com 是托马斯·梅尔茨(Thomas Merz)的公司。如果你不认识他的名字:托马斯·梅尔兹(Thomas Merz)是“PostScript和PDF圣经”的作者。

TET的第一个化身是图书馆。这个人可能可以做 Budda006 想要的一切,包括页面上每个元素的位置信息。哦,它还可以提取图像。它重新组合了碎片化的图像。

pdflib.com 还提供了这项技术的另一个化身,即 Acrobat 的 TET 插件。第三个化身是 PDFlib TET iFilter。这是用于用户桌面的独立工具。这两者都是免费的(如啤酒),可用于私人、非商业目的。

它真的很强大。比Adobe自己的文本提取要好得多。它为我提取了其他工具(包括 Adobe 的)只会吐出垃圾的文本。

我刚刚测试了桌面独立工具,他们在网页上所说的是真的。它有一个非常好的命令行。该工具处理了我的一些“有问题”的 PDF 测试文件,令我完全满意。

从现在开始,我推荐这个东西来满足每一个复杂和具有挑战性的PDF文本提取要求。

TET简直太棒了。它检测表。在表中,它标识跨多个列的单元格。它分别标识每个表格单元格的表格行和内容。它很好地处理了连字符:它删除了连字符并恢复了完整的单词。它支持非 ASCII 语言(包括 CJK、阿拉伯语和希伯来语)。遇到连字时,会还原原有字符......

试一试。

评论

38赞 Rok Strniša 9/13/2013
没有试用版,440 美元有点多,“试一试”。
1赞 NoWhereToBeSeen 8/4/2017
我测试了它,它无法识别列。我浏览了一份英文小报的头版。文本在纸上被分成 3 列,但这个插件将句子完全混合在一起,使其看起来很笨拙。免费的 Ghostscript 具有完全相同的输出。
1赞 Kurt Pfeifle 8/4/2017
@RedHotScalability:顺便说一句,如果与正确的参数一起使用,TET 确实可以识别列。但我把它留给雄心勃勃的 JS 脚本编写者阅读文档并了解如何......
5赞 zoran 3/13/2019
刚刚比较了 TET、Xpdf pdftotext 和 Ghostscript 的结果。PDF文件有拉丁文和西里尔文,多列布局。Xpdf pdftotext 是最好的,然后是 Ghostscript,最差的是 TET。
6赞 Bobrovsky 4/15/2011 #4

Docotic.Pdf 库可用于将 PDF 文件中的文本提取为纯文本或文本块的集合,每个块都有坐标。

Docotic.Pdf 也可用于从 PDF 中提取图像

免责声明:我为Bit Miracle工作。

11赞 Renaud 9/17/2012 #5

PdfTextStream(您说您一直在查看)现在对单线程应用程序免费。在我看来,它的质量比其他库要好得多(尤其是时髦的嵌入式字体等)。

它以 Java 和 C# 版本提供。

或者,你应该看看Apache PDFBox,开源。

评论

0赞 FaisalAhmed 3/3/2017
Android 不支持 PdfTextStream。有没有像这样的好库可用于 android?
0赞 Renaud 3/5/2017
@FaisalAhmed PDFBox 呢?
0赞 FaisalAhmed 3/6/2017
是的,android 也不支持 PdfBox ....PdfTextStream 和 PdfBox 都使用了一些 android 不支持的 awt 部分
0赞 FaisalAhmed 3/17/2017
我正在使用这个库,它在 Android github.com/TomRoush/PdfBox-Android 上运行良好
0赞 Simon East 10/26/2021
PdfTextStream 仅适用于 C# 和 Java。
2赞 Sun 2/19/2013 #6

对于图像提取,pdfimages 是适用于 Linux 或 Windows (win32) 的免费命令行工具:

pdfimages: 从可移植文档格式 ( PDF ) 文件中提取和保存图像

22赞 Jonathan 3/10/2013 #7

对于 python,有 PDFMinerpyPDF2。有关这些内容的更多信息,请参阅用于将 PDF 转换为文本的 Python 模块

3赞 Sebastien Malot 8/8/2013 #8

我知道这个话题已经很老了,但这种需求仍然存在。我阅读了许多文档、论坛和脚本,并构建了一个支持压缩和未压缩 pdf 的新高级文档:

https://gist.github.com/smalot/6183152

在某些情况下,出于安全原因,禁止使用命令行。 因此,原生 PHP 类可以满足许多需求。

希望它对大家有所帮助

13赞 dev4life 12/11/2013 #9

这是我的建议。 如果要从PDF中提取文本,可以将pdf文件导入Google Docs,然后将其导出为更友好的格式,例如.html,.odf,.rtf,.txt等。所有这些都使用 Drive API。它是免费*且强大的。看一看:

https://developers.google.com/drive/v2/reference/files/insert https://developers.google.com/drive/v2/reference/files/get

因为它是 REST API,所以它与所有编程语言兼容。我发布的链接有多种语言的工作示例,包括:Java、.NET、Python、PHP、Ruby 等。

我希望它有所帮助。

评论

3赞 Stand with Gaza 5/19/2014
我已经使用过该选项,我不推荐它。谷歌的 pdf 文本提取不如许多替代品(尤其是非英语)好,而且它也非常非常懒散。
0赞 Simon East 10/26/2021
我刚刚在标准的 Google Docs UI 中对此进行了测试,我实际上对它的表现感到惊讶。它正确地解析了具有多个文本列的文档,并且是我尝试过的唯一一个工具,它删除了它认为文本是单个段落的延续的行回车,但在其他地方保留了行回车。它并不完全正确,需要一些手动改进,但它似乎比大多数其他工具要好,这些工具只是在 PDF 中每一行的末尾强制返回行。
0赞 loved.by.Jesus 2/7/2023
我对谷歌有很深的隐私担忧:他们到底如何处理您上传到他们驱动器的数据/文件。作为一般规则,始终首选脱机方法:或 .在我看来,将您的文件上传到谷歌,使用他们的服务器,然后下载似乎是浪费精力和资源——我的意见。gspdftotext
7赞 kvz 2/26/2014 #10

这里的一条评论在 Windows 上使用了 gs。我在 Linux/OSX 上也取得了一些成功,语法如下:

gs \
 -q \
 -dNODISPLAY \
 -dSAFER \
 -dDELAYBIND \
 -dWRITESYSTEMDICT \
 -dSIMPLE \
 -f ps2ascii.ps \
 "${input}" \
 -dQUIET \
 -c quit

我使用了 instead 而不是,因为后者每行输出 1 个字符。dSIMPLEdCOMPLEX

2赞 Wolfgang Fahl 3/7/2014 #11

Apache pdfbox 具有此功能 - 文本部分在以下描述中描述:

http://pdfbox.apache.org/apidocs/org/apache/pdfbox/util/PDFTextStripper.html

有关示例实现,请参阅 https://github.com/WolfgangFahl/pdfindexer

测试用例 TestPdfIndexer.testExtracting 显示了它是如何工作的

43赞 131 8/14/2014 #12

一个高效的命令行工具,开源,免费,可在 linux 和 windows 上使用:简称为 pdftotext。此工具是 xpdf 库的一部分。

http://en.wikipedia.org/wiki/Pdftotext

评论

8赞 sebastian 2/8/2016
附带说明:使用开关来保留表格,效果很好。-layout
0赞 Simon East 11/16/2021
是的,PDFToText 的效果出奇地好。没有什么是完美的,但这是我尝试过的最好的。我喜欢它有几种不同的算法可供选择。有些算法更适合表格,有些算法更适合多列文本,有些算法保留空格,有些算法会修剪空格等。它的速度也快得惊人。我有一个巨大的 1200 页的 PDF,它在几秒钟内提取了文本,比 Ghostscript 快 5-10 倍。
0赞 Simon East 11/16/2021
官方网站是 xpdfreader.com
0赞 loved.by.Jesus 2/7/2023
伟大!结果比 好得多。 合并尾行处的连字符单词(选项处于活动状态时除外)并保留一些奇怪的合并的词间空格。gspdftext-layoutgs
0赞 snarik 2/17/2023
2023 注意:这确实是最佳解决方案。如果您使用的是 macOS,您正在寻找获取和其他实用程序。brew install poppinspdftotext
149赞 user2176753 10/16/2014 #13

我得到了一个 400 页的 pdf 文件,其中包含我必须导入的数据表 - 幸运的是没有图像。Ghostscript 对我有用:

gswin64c -sDEVICE=txtwrite -o output.txt input.pdf

输出文件被拆分为带有标题等的页面,但随后很容易编写一个应用程序来去除空白行等,并吸收所有 30,000 条记录。 在这种情况下没有区别。-dSIMPLE-dCOMPLEX

评论

49赞 Jannes 6/15/2015
在 linux 和 cygwin 上,命令是 代替 .完美工作。没有专利的付费废话。它只是工作。gsgswin64c
4赞 David Elson 8/9/2015
是的,效果很好!现在我可以在我的 pdf 文件上肆无忌惮地使用“grep”。由于我的 grep 比我能读的更好,所以这是一个胜利!(:-)点赞。
1赞 Jon M 12/23/2017
我遇到的唯一问题是在嵌入了“旧”字体的 pdf 上使用它。非常适合本地生成的 pdf,但对于晦涩难懂的来源则更难。否则,一个优秀的脚本。
0赞 Ooker 4/6/2020
做什么?看完《如何使用 Ghostscript》不太明白 |选择输出设备-sDEVICE=txtwrite
0赞 LuH 6/15/2020
对于 stdout 输出而不是另存为文本文件,请使用 。来源(我略有改动):gist.github.com/drmohundro/560d72ed06baaf16f191ee8be34526acgswin64c -sDEVICE=txtwrite -o- input.pdf
1赞 Dick Guertin 1/12/2015 #14

在我的 Macintosh 系统上,我发现“Adobe Reader”做得相当不错。我在桌面上创建了一个指向“Adobe Reader.app”的别名,我所要做的就是在别名上放置一个 pdf 文件,使其成为 Adobe Reader 中的活动文档,然后从文件菜单中,我选择“另存为文本...”,给它一个名称和保存位置,单击“保存”,我就完成了。

评论

6赞 mkl 1/12/2015
OP 寻找一种以编程方式从 pdf 中提取文本的解决方案。您的回答建议改为手动例程。
5赞 Eugene 2/10/2015 #15

由于问题专门针对从 PDF 中获取数据的替代工具,因此您可能有兴趣查看能够做到这一点的商业工具“ByteScout PDF Extractor SDK”:将 PDF 中的文本提取为 XML 以及定位数据 (x,y) 和字体信息:

源 PDF 中的文本:

Products | Units | Price 

输出 XML:

 <row>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="212" y="126" width="47" height="11">Products</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="428" y="126" width="27" height="11">Units</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="503" y="126" width="26" height="11">Price</text> 
  </column>
</row>

P.S.:此外,它还将文本分解为基于表格的结构。

披露:我在 ByteScout 工作