如何从PDF中提取文本?[关闭]


152

谁能推荐一个库/ API来从PDF中提取文本和图像?我们需要能够获取文档的已知区域中包含的文本,因此API需要向我们提供页面上每个元素的位置信息。

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

是否可以通过编程方式从pdf提取文本的替代方法(商业方法或免费方法)?



1
对于那些需要非常简单的东西(没有位置信息)的人,此perl regex可能就足够了:/^\s*\[?\((.*?)\)\]?\s*T[Jj]/mg。它仅查找Tj / TJ运算符,该运算符表示PDF中的所有普通文本。
Alex R

1
使用TomRoush PdfBox库在Android上效果很好
FaisalAhmed

Answers:


113

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

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

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


37
在Linux和cygwin上,该命令gs代替gswin64c。完美运作。没有专利的有偿废话。它只是工作。
Jannes

4
是的,效果很好!现在,我可以在我的pdf文件中使用“ grep”而不受惩罚。由于我的grep比阅读的更好,所以这是双赢!(:-)投票。
David Elson

1
我唯一遇到的问题是在带有嵌入式“旧”字体的pdf上使用它。完美适用于本地生成的pdf,但对于晦涩难懂的来源更难。否则,一个出色的脚本。
乔恩·M

怎么-sDEVICE=txtwrite办?阅读《如何使用Ghostscript》
Ooker,

对于stdout输出,而不是另存为文本文件,请使用gswin64c -sDEVICE=txtwrite -o- input.pdf。来源(由我稍作更改):gist.github.com/drmohundro/560d72ed06baaf16f191ee8be34526ac
LuH

33

从今天开始我就知道了:从PDF提取文本最好方法TET,即文本提取工具包。TET是PDFlib.com产品家族的一部分。

PDFlib.com是Thomas Merz的公司。如果您不知道他的名字:托马斯·梅尔兹(Thomas Merz)是《 PostScript和PDF圣经》的作者。

TET的第一个化身是图书馆。那可能可以完成Budda006想要的所有事情,包括有关页面上每个元素的位置信息。哦,它也可以提取图像。它重新组合成碎片的图像。

pdflib.com还提供了该技术的另一种形式,即AcrobatTET插件。第三类是PDFlib TET iFilter。这是用于用户桌面的独立工具。两者都是免费的(例如在啤酒中),可用于私人,非商业目的。

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

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

从现在开始,对于所有复杂且具有挑战性的PDF文本提取要求,我都会建议您这样做。

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

试试看。


32
没有试用版,“尝试一下”价格为440美元。
RokStrniša2013年


可以通过API使用此服务吗?
巴特

1
我测试了它,它无法识别列。我扫描了英文的小报首页。文本在纸上分为3列,但是此插件完全混合了句子,使其看上去很乱。免费的Ghostscript具有完全相同的输出。
NoWhereToBeSeen

1
@RedHotScalability:另外,顺便说一句,如果与正确的参数一起使用,TET 识别列。但是,我将其作为雄心勃勃的JS脚本编写者的一种练习,以阅读文档并了解如何做……
Kurt Pfeifle17年



12

这是我的建议。如果要从PDF提取文本,则可以将pdf文件导入Google文档,然后将其导出为更友好的格式,例如.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和其他语言。

希望对您有所帮助。


2
我已经使用了该选项,因此不推荐使用。Google的pdf文本提取不如许多替代方法(特别是非英语)好,而且非常流畅。
比约恩·林德奎斯特

10

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

另外,您应该看看Apache PDFBox开源。


android不支持PdfTextStream。是否有一些适用于Android的良好库?
FaisalAhmed

@FaisalAhmed PDFBox呢?
雷诺(Renaud)

是的,Android也不支持PdfBox .... PdfTextStream和PdfBox都使用了一些awt部分,而android不支持
FaisalAhmed

我正在使用这个在android github.com/TomRoush/PdfBox-Android
FaisalAhmed


6

此处的注释之一是在Windows上使用gs。我在Linux / OSX上也取得了一些成功,使用以下语法:

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

我之所以使用dSIMPLE而不是dCOMPLEX因为后者每行输出1个字符。


5

由于该问题专门针对以XML格式PDF获取数据的替代工具,因此您可能有兴趣查看商业工具“ ByteScout PDF Extractor SDK”能够做到这一点:以XML的形式从PDF中提取文本以及定位数据(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>

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

披露:我为ByteScout工作


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

此命令处理的页面3-7 input.pdf。阅读ps2ascii.ps文件本身中的注释,以查看“怪异”数字和其他信息的含义(它们表示字符串,位置,宽度,颜色,图片,矩形,字体和分页符...)。要获得“简单”的文本输出,请用替换-dCOMPLEX零件-dSIMPLE


2
如您所料,这仅输出ASCII测试。虽然是免费的,但对于您计划使用英语以外的其他语言的软件来说,这不是一个不错的选择。
userx 2010年

3
@userx:您可能会猜到,这是免费软件:因此可以使用源代码。可能扩展为支持非ASCII ...
Kurt Pfeifle 2010年

@userx:今天我从pdflib.com发现了“ TET”,即文本提取工具包。看到我的其他答案。
Kurt Pfeifle

来自Ghostscript 9.07的ps2ascii在我的OpenBSD系统上可以很好地工作。我刚刚将526页的PDF转换为纯文本。现在,我可以轻松grep并提取注释文本。我使用了简单的命令ps2ascii book.pdf notes.txt。如果您的文档主要是ASCII,那么您很幸运。
Clint Pachl





0

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


5
OP寻找解决方案 编程方式从pdf提取文本。您的答案将提出一个手动例程。
mkl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.