如何从PDF中提取文本?

Bud*_*007 141 pdf text text-extraction ghostscript extraction

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

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

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

小智 99

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

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

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

  • 在linux和cygwin上,命令是`gs`而不是`gswin64c`.完美的工作.没有专利的付费垃圾.它只是有效. (33认同)
  • 是的,效果很好!现在我可以在我的pdf文件中使用"grep"而不受惩罚.因为我能比我读得更好,所以这是一场胜利!(:-) Upvote. (3认同)

Kur*_*fle 34

从今天起我就知道了:从PDF文本中提取文本最好方法文本提取工具包TET.TET是PDFlib.com系列产品的一部分.

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

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

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

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

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

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

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

试试看.

  • 没有试用版,440美元对于"尝试一下"有点多. (31认同)
  • @Darthenius:您一定错过了这句话:"[PDFlib TET可以在没有许可证的情况下进行评估,但只会处理最多10页和1 MB大小的PDF文档,除非应用了有效的许可证密钥](http:// www .pdflib.com /下载/ TET /)". (17认同)
  • 刚刚比较了 TET、Xpdf pdftotext 和 Ghostscript 的结果。PDF 文件具有拉丁文和西里尔文脚本,以及多列布局。Xpdf pdftotext 是最好的,然后是 Ghostscript,最差的是 TET。 (3认同)

131*_*131 27

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

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

  • 旁注:使用`-layout`开关来保存表格,效果很好. (4认同)

Jon*_*han 21

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


oab*_*rca 11

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

我希望它有所帮助.

  • 我已经使用了那个选项,我不推荐它。Google 的 pdf 文本提取不如许多替代品(尤其是非英语)好,而且它也非常非常慢。 (3认同)

Ren*_*aud 9

PdfTextStream(你说你一直在看)现在可以免费用于单线程应用程序.在我看来,它的质量比其他库(特别是像时髦的嵌入字体等)更好.

或者,您应该看看Apache PDFBox,开源.


Bob*_*sky 6

Docotic.Pdf库可用于从PDF文件中提取文本作为纯文本或具有每个块的坐标的文本块的集合.

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

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


kvz*_*kvz 6

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

gs \
 -q \
 -dNODISPLAY \
 -dSAFER \
 -dDELAYBIND \
 -dWRITESYSTEMDICT \
 -dSIMPLE \
 -f ps2ascii.ps \
 "${input}" \
 -dQUIET \
 -c quit
Run Code Online (Sandbox Code Playgroud)

我用dSIMPLE而不是dCOMPLEX因为后者每行输出1个字符.


Eug*_*ene 5

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

源 PDF 中的文本:

Products | Units | Price 
Run Code Online (Sandbox Code Playgroud)

输出 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>
Run Code Online (Sandbox Code Playgroud)

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

披露:我为 ByteScout 工作


Kur*_*fle 3

我目前能想到的最好的东西(在“简单”工具列表中)是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
Run Code Online (Sandbox Code Playgroud)

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

  • @userx:正如您所猜测的,这是免费软件:因此源代码可用。可以扩展对非 ASCII 的支持... (3认同)
  • 正如您所猜测的,这仅输出 ASCII 测试。虽然免费,但对于您计划使用英语以外的语言的软件来说,这不是一个很好的选择。 (2认同)