Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文件内容搜索#_C#_Wpf_Winforms_Full Text Search_Pdf Reader - Fatal编程技术网

C# 文件内容搜索#

C# 文件内容搜索#,c#,wpf,winforms,full-text-search,pdf-reader,C#,Wpf,Winforms,Full Text Search,Pdf Reader,我正在尝试在我的应用程序中实现此功能 就像在windows中一样,我在搜索框中键入内容,如果在设置中选中了文件内容,那么无论是文本文件还是pdf/word文件,搜索都会返回包含搜索框中字符串的文件 因此,我已经提出了一个文件和文件夹搜索的应用程序,它对于文本文件和word文件的文件内容搜索非常有效。我正在使用互操作逐字文件 我知道,我可以使用iTextSharp或其他第三方的东西来处理pdf文件。但这并不能让我满意。我只是想知道windows是怎么做到的?或者如果其他人以不同的方式做了这件事?

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

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

因此,我已经提出了一个文件和文件夹搜索的应用程序,它对于文本文件和word文件的
文件内容搜索非常有效。我正在使用互操作逐字文件


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

据我所知,在没有安装第三方工具、软件或实用程序的情况下,搜索pdf内容是不可能的。比如说pdfgrep。但是,如果你设法制作一个c#程序,我会包括一个第三方库来完成这项工作

我为这个答案中类似的东西做了一个解决方案,稍加调整,你就可以得到你想要的东西。唯一的东西是PdfClown,它适用于.net框架,但另一方面它是开源的,免费的,没有限制。但如果你正在寻找.NETCore,你可能会找到一些免费(有限制)或付费的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;
        }
    }
}
例如,在我的情况下,发票中有sushi一词:

c:\temp\invoice0001.pdf contains word Sushi
尽管如此,这是一个解决方案的例子。你可以从这里把它带到下一个层次。享受你的一天

我留下了一些我所搜索内容的链接:


如果您的应用程序打算从存储在数据库中的二进制文件中搜索文件内容,那么SQL全文搜索功能可以为您实现这一点

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


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

基本上,你的PDF查看器会安装一个IFilter,以便Windows可以使用它来搜索PDF内容:如果你愿意,我可以留下我在答案中修改过的pdfclown代码。这肯定会有很大帮助。实际上,正如您在上一个答案中所建议的,我使用了pdfclown,但我的代码需要10分钟才能在140个pdf文件中搜索特定文本,比如说
invoice
。但是我真的很想试试你的代码。谢谢你的回复。没问题。无论如何,谢谢:)是的,这很好,不过完成任务需要25分钟。但正如你所说的,我将尝试相应地修改它。非常感谢大家的欢迎,我知道代码需要一些改进,性能也可以提高,但这需要一些额外的工作。希望你能把它提升到一个新的水平。享受你的一天。
c:\temp\invoice0001.pdf contains word Sushi