【问题标题】:File content search c#文件内容搜索c#
【发布时间】:2021-06-07 10:29:28
【问题描述】:

我正在尝试在我的应用程序中实现此功能。

就像在 Windows 中一样,我在搜索框中输入内容,如果在设置中检查了文件内容,那么无论是文本文件还是 pdf/word 文件,搜索都会返回包含搜索框。

所以,我已经想出了一个用于文件和文件夹搜索的应用程序,它对于 file content search 的文本文件和 word 文件非常有效。我正在对 word 文件使用 interop word。

我知道,我可以使用 iTextSharp 或其他一些 3rd 方的东西来为 pdf 文件执行此操作。但这并不能满足我。我只是想知道windows是怎么做的?或者如果其他人以不同的方式做到这一点?我只是不想使用任何 3rd 方工具,但并不意味着我不能。我只是想保持我的应用程序轻巧,而不是使用许多工具来丢弃它。

【问题讨论】:

标签: c# wpf winforms full-text-search pdf-reader


【解决方案1】:

据我所知,如果没有安装第 3 方工具、软件或实用程序,就无法搜索 pdf 内容。所以有 pdfgrep 例如。但是,如果您设法以任何方式制作 c# 程序,我会包含一个第三方库来完成这项工作。

我在这个答案Read specific value based on label name from PDF in C# 中为类似的事情做了一个解决方案,稍微调整一下你就可以得到你想要的东西。唯一的问题是 PdfClown,它适用于 .net 框架,但另一方面它是开源的、免费的并且没有限制。但是,如果您正在寻找 .net 核心,您可能会找到一些免费(有限制)或付费的 pdf 库。

正如您在评论中所要求的,这里是在侧 pdf 页面中查找文本的示例解决方案。我在代码中留下了 cmets:

//The found content
private List<string> _contentList;

//Search for content in a given pdf file
public bool SearchPdf(FileInfo fileInfo, string word)
{
    _contentList = new List<string>();
    ExtractPages(fileInfo.FullName);
    var content = string.Join(" ", _contentList);
    return content.Contains(word);
}

//Extract content for each page of given pdf file
private void ExtractPages(string filePath)
{
    using (var file = new File(filePath))
    {
        var document = file.Document;

        foreach (var page in document.Pages)
        {
            Extract(new ContentScanner(page));
        }
    }
}

//Extract content of pdf page and put the found result inside _contentList
private void Extract(ContentScanner level)
{
    if (level == null)
        return;

    while (level.MoveNext())
    {
        var content = level.Current;
        switch (content)
        {
            case ShowText text:
                {
                    var font = level.State.Font;
                    _contentList.Add(font.Decode(text.Text));
                    break;
                }
            case Text _:
            case ContainerObject _:
                Extract(level.ChildLevel);
                break;
        }
    }
}

现在让我们进行快速测试,因此我们假设您的所有发票都在 c:\temp 文件夹中:

static void Main(string[] args)
{
    var program = new SearchPdfContent();

    DirectoryInfo d = new DirectoryInfo(@"c:\temp");
    FileInfo[] Files = d.GetFiles("*.pdf");
    var word = "Sushi";
    foreach (FileInfo file in Files)
    {
        var found = program.SearchPdf(file, word);
        if (found)
        {
            Console.WriteLine($"{file.FullName} contains word {word}");
        }
    }
}

在我的例子中,我在发票中有例如寿司这个词:

c:\temp\invoice0001.pdf contains word Sushi

说了这么多,这是一个解决方案的例子。你可以从这里把它带到一个新的水平。享受你的一天。

我留下一些我搜索过的链接:

【讨论】:

  • 如果你愿意,我可以留下我在答案中制作的 pdfclown 的调整代码。
  • 肯定会有很大帮助。实际上,正如您之前的回答中所建议的那样,我使用了 pdfclown,但我的代码需要 10 分钟才能在 140 个 pdf 文件中搜索特定文本,例如 invoice。但我真的很想试试你的代码。感谢回复
  • 当然。不是问题。无论如何谢谢:)
  • 是的,虽然需要 25 分钟才能完成任务,但效果很好。但正如你所说,我会尝试相应地修改它。非常感谢朋友
  • 欢迎您,我知道代码需要一些改进,性能也可以提高,但这需要一些额外的工作。希望你能把它带到一个新的水平。享受你的一天。
【解决方案2】:

如果您的应用程序要从存储在数据库中的二进制文件中搜索文件内容,SQL 全文搜索功能可以为您实现。

您只需确保已安装所需的IFilters,并在存储二进制数据的表上创建全文索引。

但如果您的应用程序必须实时访问文件夹并搜索文件内容,您可能需要像@maytham-ɯɐɥʇʎɐɯ所说的第三方工具。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多