任何人都可以推荐一个库/API 来从 PDF 中提取文本和图像吗?我们需要能够获取文档预先知道的区域中包含的文本,因此 API 需要为我们提供页面上每个元素的位置信息。
我们希望以xml
或json
格式输出该数据。我们目前正在研究PdfTextStream,它看起来不错,但想听听其他人的经验和建议。
是否有替代方案(商业或免费)以编程方式从 pdf 中提取文本?
任何人都可以推荐一个库/API 来从 PDF 中提取文本和图像吗?我们需要能够获取文档预先知道的区域中包含的文本,因此 API 需要为我们提供页面上每个元素的位置信息。
我们希望以xml
或json
格式输出该数据。我们目前正在研究PdfTextStream,它看起来不错,但想听听其他人的经验和建议。
是否有替代方案(商业或免费)以编程方式从 pdf 中提取文本?
我收到了一个 400 页的 pdf 文件,其中包含我必须导入的数据表 - 幸运的是没有图像。Ghostscript为我工作:
gswin64c -sDEVICE=txtwrite -o output.txt input.pdf
输出文件被分成带有标题等的页面,但随后很容易编写一个应用程序来去除空白行等,并吸收所有 30,000 条记录。在这种情况下没有任何区别-dSIMPLE
。-dCOMPLEX
一个高效的命令行工具,开源,免费,在 linux 和 windows 上都可以使用:简单命名为 pdftotext。该工具是 xpdf 库的一部分。
从今天开始我就知道:从 PDF 中提取文本的最佳方法是TET,文本提取工具包。TET 是 PDFlib.com 产品系列的一部分。
PDFlib.com 是 Thomas Merz 的公司。如果您不认识他的名字:Thomas Merz 是“PostScript and PDF Bible”的作者。
TET 的第一个化身是图书馆。它可能可以做 Budda006 想要的所有事情,包括页面上每个元素的位置信息。哦,它还可以提取图像。它将碎片化为碎片的图像重新组合。
pdflib.com 还提供了该技术的另一个化身,即Acrobat 的 TET 插件。第三个化身是PDFlib TET iFilter。这是用于用户桌面的独立工具。两者都是免费的(如啤酒),可用于私人、非商业目的。
而且它真的很强大。比 Adobe 自己的文本提取要好得多。它为我提取了其他工具(包括 Adobe 的)只吐出垃圾的文本。
我刚刚测试了桌面独立工具,他们在网页上说的是真的。它有一个非常好的命令行。我对该工具处理的一些“有问题的”PDF 测试文件非常满意。
从现在开始,这个东西将成为我对每一个复杂和具有挑战性的 PDF 文本提取要求的推荐。
TET 简直太棒了。它检测表。在表格内部,它标识跨越多列的单元格。它分别标识每个表格单元格的表格行和内容。它很好地处理连字符:它删除连字符并恢复完整的单词。它支持非 ASCII 语言(包括 CJK、阿拉伯语和希伯来语)。当遇到连字时,它会恢复原来的字符...
试试看。
For python, there is PDFMiner and pyPDF2. For more information on these, see Python module for converting PDF to text.
这是我的建议。如果您想从 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 等。
我希望它有所帮助。
PdfTextStream(你说你一直在看)现在对单线程应用程序是免费的。在我看来,它的质量比其他库要好得多(尤其是对于时髦的嵌入式字体等)。
它在 Java 和 C# 中可用。
或者,您应该看看开源的Apache PDFBox。
这里的评论之一在 Windows 上使用了 gs。我在 Linux/OSX 上也取得了一些成功,语法如下:
gs \
-q \
-dNODISPLAY \
-dSAFER \
-dDELAYBIND \
-dWRITESYSTEMDICT \
-dSIMPLE \
-f ps2ascii.ps \
"${input}" \
-dQUIET \
-c quit
我使用dSIMPLE
而不是dCOMPLEX
因为后者每行输出 1 个字符。
Docotic.Pdf 库可用于从 PDF 文件中提取文本作为纯文本或文本块的集合,每个块都有坐标。
Docotic.Pdf 也可用于从 PDF 中提取图像。
免责声明:我为 Bit Miracle 工作。
由于问题是关于从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>
PS:此外,它还将文本分解为基于表格的结构。
披露:我为 ByteScout 工作
我知道这个话题已经很老了,但是这种需求仍然存在。我阅读了许多文档、论坛和脚本,并构建了一个支持压缩和未压缩 pdf 的新高级文档:
https://gist.github.com/smalot/6183152
在某些情况下,出于安全原因禁止使用命令行。因此,原生 PHP 类可以满足许多需求。
希望对大家有帮助
我目前能想到的最好的东西(在“简单”工具列表中)是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
.
Apache pdfbox 具有此功能 - 文本部分描述如下:
http://pdfbox.apache.org/apidocs/org/apache/pdfbox/util/PDFTextStripper.html
有关示例实现,请参见 https://github.com/WolfgangFahl/pdfindexer
测试用例 TestPdfIndexer.testExtracting 展示了它是如何工作的
对于图像提取,pdfimages 是适用于 Linux 或 Windows (win32) 的免费命令行工具:
QuickPDF 似乎是一个合理的库,应该以合理的价格做你想做的事。
http://www.quickpdflibrary.com/ - 他们有 30 天的试用期。
在我的 Macintosh 系统上,我发现“Adobe Reader”做得相当不错。我在我的桌面上创建了一个指向“Adobe Reader.app”的别名,我所做的就是在别名上放置一个 pdf 文件,使其成为 Adobe Reader 中的活动文档,然后从文件菜单中,我选择“另存为文本...”,给它一个名称和保存位置,单击“保存”,我就完成了。