文件内容搜索c#

File content search c#

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

就像在 windows 中一样,我在搜索框中输入内容,如果在设置中选中了文件内容,那么无论是文本文件还是 pdf/word 文件,搜索 returns 我在搜索框中包含该字符串的文件。

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

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

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

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

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

//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

综上所述,这是一个解决方案示例。你可以从这里把它带到一个新的水平。享受你的一天。

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

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

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

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