我需要一个.NET库,可以从PDF、Excel和Word文件中提取文本数据。
最好是一个免费的工具!
你能推荐一些吗?
非常感谢。
我需要一个.NET库,可以从PDF、Excel和Word文件中提取文本数据。
最好是一个免费的工具!
你能推荐一些吗?
非常感谢。
作为一个花费很多时间寻找免费解决方案的人,来处理(几乎)这个确切问题,我可以坦诚地告诉你,你不会找到一个能够从所有这些格式中良好地提取文本的免费库。我所知道的唯一一个在所有这些格式(以及更多)上表现出色的库是商业库,它实际上不是 .NET 的本地库,而是一个 C++/COM 库,带有一个 C++/CLI .NET 包装器。
那么有哪些选择呢?
iTextSharp -- 这个库非常适合从 PDF 中提取文本。虽然该库的后续版本是商业友好的(LGPL),但作者们决定要收费,所以他们改为在 AGPL 下发布软件,因此,除非您想发布所有源代码,否则您可能不想使用其中的某些版本。然而,最后一个根据 LGPL 授权的版本(4.1.6)可以在互联网上找到。这个 SO 问题有一个链接,指向一个在 LGPL 下的版本。
PdfBox -- 另一个 PDF 库。我认为这个库更好,因为它是根据 Apache 2.0 许可证发布的。它存在一些问题,因为有时(也许很少)它不能像 iTextSharp 那样做得那么好。我更多地将其归因于它是一个较新的库。然而,请注意,我的经验是几个月前的。这个项目正在积极开发中,仅在上个月就已解决了52个问题。我会密切关注这个库。请注意,这是一个 Java 库。(继续阅读下面的内容以获取更多信息。)
POI 或 NPOI -- 这些库是专门用于 Microsoft Office 文档的,特别是针对预2007格式,OLE二进制文件格式。尽管我不确定该库的新型OpenXML格式的支持程度有多成熟,但它确实支持这些格式。POI是Java版本(继续阅读下面了解为什么要包括这个),而NPOI是本地.NET版本。然而,NPOI只支持Excel文档,而POI可以在更多类型文档上进行文本提取。
Open XML SDK 2.0 -- 这是一个用于读取/修改由Microsoft自己创建的Office 2007+(未加密OpenXML)文档的库!这是一个非常适合处理这些文档的神奇库。然而,它是一个较低层次的库,因此实际上没有一个它可以做所有事情的文本提取类(据我所知)。有一个相当不错的示例(我不确定是否涵盖某些情况,比如表格中的文本等),可以从Word文档中提取文本,请参考该 Stack Overflow 答案。
Tika -- 再次强调:这是另一个Java库(我没白告诉你Java库相关信息,继续阅读!🙂) 这将是文本提取最接近"一个库"的方式。使用现有解析库,Tika可以从许多不同类型的文件中提取元数据和结构化文本内容。它实际上在处理Office和PDF文档时使用POI和PdfBox。
非商业用途
iFilters可以使用,在其他SO答案中的多个问题上都有提到,但返回的文本是无结构的。有时候它真的很差...至少对人类来说是无法阅读的。我认为iFilters也已被弃用,并且根据许可证问题,您可能无法重新分发它们。
我为什么要提到所有这些Java库呢?原因有两个。首先,没有任何免费的.NET等价物能够接近这些Java库的质量。其次,您可以在.NET中使用这些库(我个人已经用过这些库做过这件事情,所以至少可以为此作证),使用IKVM。它是.NET内置Java的实现。这里有一个很好的例子,介绍如何使用IKVM将Tika转换为可以在您的项目中使用的.NET程序集。也许最吓人的是,IKVM真的很好用!
编辑:我忘记了那个博客的作者实际上已经在Github项目上发布了代码和转换库。因此,如果您想快速查看它,可以在那里查看。然而,这是一个较老版本的Tika,已有一年之久。如果结果不如您所期望的那样,请尝试使用最新版本自行尝试。
ParserContext context = new ParserContext("test.xlsx");
ISpreadsheetParser parser = ParserFactory.CreateSpreadsheet(context);
ToxySpreadsheet ss = parser.Parse();
//then you can start handle the result - a ToxySpreadsheet object
对于从PDF中提取文本,itextsharp非常棒。它是免费且开源的。
使用这个库来读取PDF中的文本非常容易。
如果您只需要文本,则可以使用iFilter。它不是单一的产品,但是它是免费的。iFilter用于提取文本以支持Microsoft Index Service。搜索iFilter .NET C#以获取如何使用它的示例。如果您需要格式化文本,则不是正确的工具。它仅提取带有许多换行符的原始文本。