如何从Pdf、Word和Excel文档中提取文本?

15

我需要一个.NET库,可以从PDF、Excel和Word文件中提取文本数据。

最好是一个免费的工具!

你能推荐一些吗?

非常感谢。


1
可能是PDF阅读器的重复问题。 - cdhowie
2
这不完全是重复的问题。它询问一个工具执行PDF、Excel和Word提取的能力。 - The Light
我进行了搜索,找到了一些但不是很好...有没有一个工具能够提取这3种文件类型会更好呢? - The Light
1
为了改编Unix哲学,“编写[库],只做一件事,并且做得很好。” 您更愿意使用一个优秀的PDF阅读器库和一个优秀的Word阅读器库,还是一个同时处理两者但效果不佳的库?(另请参见“如果您试图做所有事情,您将一事无成。”) - cdhowie
一个优秀的PDF/Word/Excel阅读器;保持积极 ;)。是的,在实践中,我可能需要使用单独的库,但是可以创建一个处理所有三个的库,例如TextExtractionGod!我刚刚给了你一个好的商业/产品想法;)。 - The Light
显示剩余2条评论
6个回答

32

作为一个花费很多时间寻找免费解决方案的人,来处理(几乎)这个确切问题,我可以坦诚地告诉你,你不会找到一个能够从所有这些格式中良好地提取文本的免费库。我所知道的唯一一个在所有这些格式(以及更多)上表现出色的库是商业库,它实际上不是 .NET 的本地库,而是一个 C++/COM 库,带有一个 C++/CLI .NET 包装器。

那么有哪些选择呢?

  • iTextSharp -- 这个库非常适合从 PDF 中提取文本。虽然该库的后续版本是商业友好的(LGPL),但作者们决定要收费,所以他们改为在 AGPL 下发布软件,因此,除非您想发布所有源代码,否则您可能不想使用其中的某些版本。然而,最后一个根据 LGPL 授权的版本(4.1.6)可以在互联网上找到。这个 SO 问题有一个链接,指向一个在 LGPL 下的版本。

  • PdfBox -- 另一个 PDF 库。我认为这个库更好,因为它是根据 Apache 2.0 许可证发布的。它存在一些问题,因为有时(也许很少)它不能像 iTextSharp 那样做得那么好。我更多地将其归因于它是一个较新的库。然而,请注意,我的经验是几个月前的。这个项目正在积极开发中,仅在上个月就已解决了52个问题。我会密切关注这个库。请注意,这是一个 Java 库。(继续阅读下面的内容以获取更多信息。)

  • POINPOI -- 这些库是专门用于 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。

  • 非商业用途

    • dtSearch -- 这是我非常熟悉的一个库。它表现得非常出色,可以解析大量格式的文件。然而,它需要花费一定的资金,对于你的需求来说可能有些过头了。它实际上恰好是我们需要的,但是我们正在试图摆脱它,因为我们只用它来解析文本(它实际上是一个全文搜索引擎),而且有很多其他解析库可以使用或修改以满足我们的需求,但它确实比这些其他库更优秀。正如我之前提到的,它也不是本地的.NET代码。使用C++/CLI封装器在DLL和.NET运行时之间进行交互。

    iFilters可以使用,在其他SO答案中的多个问题上都有提到,但返回的文本是无结构的。有时候它真的很差...至少对人类来说是无法阅读的。我认为iFilters也已被弃用,并且根据许可证问题,您可能无法重新分发它们。


    我为什么要提到所有这些Java库呢?原因有两个。首先,没有任何免费的.NET等价物能够接近这些Java库的质量。其次,您可以在.NET中使用这些库(我个人已经用过这些库做过这件事情,所以至少可以为此作证),使用IKVM。它是.NET内置Java的实现。这里有一个很好的例子,介绍如何使用IKVM将Tika转换为可以在您的项目中使用的.NET程序集。也许最吓人的是,IKVM真的很好用!

    编辑:我忘记了那个博客的作者实际上已经在Github项目上发布了代码和转换库。因此,如果您想快速查看它,可以在那里查看。然而,这是一个较老版本的Tika,已有一年之久。如果结果不如您所期望的那样,请尝试使用最新版本自行尝试。


    值得一提的是,Open XML只适用于x版本(例如xdoc)。即使使用Office 2010保存为本机.doc文件也无法正常工作。据我所知。 - paparazzo
    @Blam,没错。我的意思是只能读取/修改Office 2007+文档,也就是只支持Open XML格式。 - Christopher Currens
    嘿,不错!你有关于Snowtide和最新的Ghostscript如何工作的想法吗?是的,有很多SO帖子,但你似乎有很高的研究水平。 - Dexters
    请查看新的库,Apitron PDF Kit,能够提取任何格式的文本。 - Hugo Moreno
    1
    Tika on dot net 可通过 NuGet 获取:https://www.nuget.org/packages/TikaOnDotNet/。在我的初步测试中表现出色,非常易于使用,并支持各种文件格式。相当令人印象深刻。 - David Hammond
    tika通过ikvm很不错。但它是一个62M的程序集 :) - undefined

    8
    你可以查看 toxy.codeplex.com。Toxy是一个纯.NET文本提取框架。
    使用Toxy非常简单。例如,要提取名为test.xlsx的Excel电子表格文件。
    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
    

    我尝试了Toxy,它运行良好。然而,对于阅读PDF,它使用的itextsharp.dll版本5.5.0是不免费的。 - WizzleWuzzle
    FYI,此链接现已被Google Chrome标记为危险。 - chriszumberge
    Toxy仓库的新链接:https://github.com/nissl-lab/toxy - Tony Qu

    2

    PDFSharp在提取文本方面似乎不是很出色:https://dev59.com/KGDVa4cB1Zd3GeqPZg9E#9161732 - The Light
    它完全正常工作,只需要通过您在pdfsharp论坛引用的帖子中提供的响应链接进行一些文本解析。该论坛有很好的支持,我已经引用了。 - NKamrath

    1

    对于从PDF中提取文本,itextsharp非常棒。它是免费且开源的。

    使用这个库来读取PDF中的文本非常容易。


    1
    itextsharp在商业应用中使用并非完全免费:http://itextpdf.com/terms-of-use/index.php 或 http://itextpdf.com/summit.php#talk9 - The Light
    @TheLight - iTextSharp的4.1.6及更早版本是根据LGPL许可证授权的,可以在商业应用程序中自由使用。 - Christopher Currens

    1
    我建议使用Aspose Total。几年前,我做了一个项目,几乎完全符合您所要求的内容,并将其与在不同版本的Office之间使用Office Interop工具(在更改为XML之前)进行比较,发现Aspose是最强大的库。根据您所说的内容,您可能需要进行一些OCR处理。虽然价格不便宜,但我发现他们的API非常稳定,并且适用于您所要求的大多数文件类型的版本。您应该能够使用免费试用版来查看它是否适合您的项目。除了我在生产环境中使用他们的工具外,我与Aspose没有任何关联。 Aspose Total

    0

    如果您只需要文本,则可以使用iFilter。它不是单一的产品,但是它是免费的。iFilter用于提取文本以支持Microsoft Index Service。搜索iFilter .NET C#以获取如何使用它的示例。如果您需要格式化文本,则不是正确的工具。它仅提取带有许多换行符的原始文本。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接