如何从PDF中提取文本?

时间:2010-09-06 11:11:09

标签: pdf text ghostscript extraction text-extraction

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

我们希望以xmljson格式输出数据。我们目前正在查看 PdfTextStream 这看起来相当不错,但我希望听到其他人的经验和建议。

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

15 个答案:

答案 0 :(得分:90)

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

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

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

答案 1 :(得分:33)

从今天起我就知道了:从PDF 中提取文本的最好的事情是TET, the text extraction toolkit。 TET是PDFlib.com系列产品的一部分。

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

TET的第一个化身是a library。那个人可能会做Budda006想要的一切,包括关于页面上每个元素的位置信息。哦,它也可以提取图像。它重新组合碎片成片。

pdflib.com还提供了该技术的另一个版本,TET plugin for Acrobat。第三个化身是PDFlib TET iFilter。这是用户桌面的独立工具。这些都是免费的(如在啤酒中)用于私人,非商业目的。

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

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

从现在开始,这件事将成为我对每一个复杂而具有挑战性的PDF文本提取要求的建议。

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

试一试。

答案 2 :(得分:26)

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

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

答案 3 :(得分:20)

对于python,有PDFMinerpyPDF2。有关这些的更多信息,请参阅Python module for converting PDF to text

答案 4 :(得分:8)

对于单线程应用程序,

PdfTextStream(你说你一直在关注)现在免费。在我看来,它的质量比其他库(特别是像时髦的嵌入字体等)更好。

或者,您应该查看Apache PDFBox,开源。

答案 5 :(得分:8)

这是我的建议。 如果要从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等。

我希望它有所帮助。

答案 6 :(得分:6)

Docotic.Pdf library可以用作extract text from PDF文件作为纯文本或带有每个块坐标的文本块集合。

Docotic.Pdf也可以用于extract images from PDFs

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

答案 7 :(得分:6)

其中一条评论在Windows上使用了gs。我在Linux / OSX上也取得了一些成功,使用以下语法:

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

我使用dSIMPLE代替dCOMPLEX,因为后者每行输出1个字符。

答案 8 :(得分:4)

由于问题是关于从 PDF作为XML 获取数据的替代工具,因此您可能有兴趣看看能够完成此操作的商业工具"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工作

答案 9 :(得分:3)

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

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

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

希望它能帮助人们

答案 10 :(得分:2)

我目前可以想到的最好的事情(在“简单”工具列表中)是Ghostscript(当前版本是v.8.71)和PostScript实用程序ps2ascii.ps。 Ghostscript将其发送到lib子目录中。试试这个(在Windows上):

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

此命令处理input.pdf的第3-7页。阅读ps2ascii.ps文件中的注释,看看“怪异”数字和附加信息的含义(它们表示字符串,位置,宽度,颜色,图片,矩形,字体和分页符...... < / em>的)。要获得“简单”文本输出,请将-dCOMPLEX部分替换为-dSIMPLE

答案 11 :(得分:2)

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

pdfimages: Extract and Save Images From A Portable Document Format ( PDF ) File

答案 12 :(得分:2)

Apache pdfbox具有此功能 - 文本部分描述于:

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

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

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

答案 13 :(得分:1)

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

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

答案 14 :(得分:0)

在我的Macintosh系统上,我发现&#34; Adob​​e Reader&#34;做得相当不错。我在桌面上创建了一个指向&#34; Adob​​e Reader.app&#34;的别名,我所做的就是在别名上删除一个pdf文件,这使它成为Adobe Reader中的活动文档,然后从在文件菜单中,我选择&#34;另存为文本...&#34;,为其命名并在何处保存,单击&#34;保存&#34;,然后我就完成了。