有人可以推荐使用库/ API从PDF中提取文本和图像吗? 我们需要能够获得包含在文档的预先知道区域中的文本,因此API需要向我们提供页面上每个元素的位置信息。
我们希望以xml
或json
格式输出数据。我们目前正在查看 PdfTextStream 这看起来相当不错,但我希望听到其他人的经验和建议。
是否有以编程方式从pdf中提取文本的替代品(商业版或免费版)?
答案 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库的一部分。
答案 3 :(得分:20)
对于python,有PDFMiner和pyPDF2。有关这些的更多信息,请参阅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; Adobe Reader&#34;做得相当不错。我在桌面上创建了一个指向&#34; Adobe Reader.app&#34;的别名,我所做的就是在别名上删除一个pdf文件,这使它成为Adobe Reader中的活动文档,然后从在文件菜单中,我选择&#34;另存为文本...&#34;,为其命名并在何处保存,单击&#34;保存&#34;,然后我就完成了。