有没有人可以推荐一个用于从PDF中提取文本和图像的库/API?
我们需要能够获取文档中预先已知区域内的文本,因此API需要为我们提供每个元素在页面上的位置信息。
我们希望将该数据输出为xml
或json
格式。目前我们正在研究PdfTextStream,它看起来非常不错,但我们想听听其他人的经验和建议。
有没有其他的方法(商业或免费)可以程序化地从PDF中提取文本?
有没有人可以推荐一个用于从PDF中提取文本和图像的库/API?
我们需要能够获取文档中预先已知区域内的文本,因此API需要为我们提供每个元素在页面上的位置信息。
我们希望将该数据输出为xml
或json
格式。目前我们正在研究PdfTextStream,它看起来非常不错,但我们想听听其他人的经验和建议。
有没有其他的方法(商业或免费)可以程序化地从PDF中提取文本?
我收到了一份包含数据表格的,共400页的pdf文件需要导入 - 幸运的是没有图片。 Ghostscript 对我很有帮助:
gswin64c -sDEVICE=txtwrite -o output.txt input.pdf
输出文件被拆分成了包含头部等信息的页面,但是很容易编写一个应用程序来剔除空行等内容,并导入所有30,000条记录。在这种情况下,-dSIMPLE
和-dCOMPLEX
没有任何区别。
gs
而不是gswin64c
。效果完美,没有专利付费的垃圾,它只起作用。 - Jannesgswin64c -sDEVICE=txtwrite -o- input.pdf
。来源(稍作修改):https://gist.github.com/drmohundro/560d72ed06baaf16f191ee8be34526ac - LuH一款高效的命令行工具,开源且不收取任何费用,在 Linux 和 Windows 平台上均可使用:名称简单,叫做 pdftotext。该工具是 xpdf 库的一部分。
gs
获得了更好的结果。pdftext
在行末合并了连字符单词(除非选项 -layout
激活),并保留了一些词间空格,而 gs
则奇怪地合并了这些空格。 - loved.by.Jesus我从今天开始知道了一个事实:从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、阿拉伯语和希伯来语)。遇到连字时,它会恢复原始字符......
请试用一下。
这是我的建议。 如果您想从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等。
希望对您有所帮助。
gs
或pdftotext
。在我看来,将文件上传到谷歌,使用他们的服务器,然后再下载似乎是一种浪费能源和资源的行为——这是我的观点。 - loved.by.JesusPdfTextStream(你说你一直在看的)现在适用于单线程应用程序,且免费。在我看来,它的质量比其他库要好得多(尤其是对于像时髦的嵌入字体等东西)。它有Java和C#版本。
或者,你可以看看开源的Apache PDFBox。
这里有一个评论提到在Windows上使用gs,我也曾在Linux/OSX上尝试过,下面是语法:
gs \
-q \
-dNODISPLAY \
-dSAFER \
-dDELAYBIND \
-dWRITESYSTEMDICT \
-dSIMPLE \
-f ps2ascii.ps \
"${input}" \
-dQUIET \
-c quit
dSIMPLE
而不是dCOMPLEX
,因为后者每行输出一个字符。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工作
目前我能想到的最好的(在“简单”工具列表中)是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页的内容。阅读文件中的注释,以了解“奇怪”的数字和附加信息的含义(它们表示字符串、位置、宽度、颜色、图片、矩形、字体和分页符等等...)。要获得“简单”的文本输出,请用-dSIMPLE
替换-dCOMPLEX
部分。
ps2ascii book.pdf notes.txt
。如果您的文档主要是 ASCII,那么您很幸运。 - Clint Pachl
/^\s*\[?\((.*?)\)\]?\s*T[Jj]/mg
。它只是寻找Tj/TJ运算符,这表示PDF中的所有普通文本。 - Alex R