问题描述
我正在尝试在我的应用程序中实现此功能。
就像在 Windows 中一样,我在搜索框中输入内容,如果在设置中选中了文件内容,那么无论是文本文件还是 pdf/word 文件,搜索都会返回包含字符串的文件搜索框。
所以,我已经想出了一个用于文件和文件夹搜索的应用程序,它非常适合用于文本文件和 word 文件的 file content search
。我正在对 word 文件使用互操作字。
我知道,我可以使用 iTextSharp
或其他一些 3rd 方的东西来为 pdf 文件执行此操作。但这并不能让我满意。我只是想知道windows是怎么做的?或者如果其他人以不同的方式做到了?我只是不想使用任何 3rd 方工具,但并不意味着我不能。我只是想让我的应用程序保持轻便,而不是用很多工具来转储它。
解决方法
据我所知,如果没有安装第 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
说了这么多,这是一个解决方案的例子。你可以把它从这里带到一个新的水平。享受你的一天。
我留下了一些我搜索过的链接:
- Searching for files with specific file content
- How to search contents of multiple pdf files?
- Windows search PDF contents
- https://superuser.com/questions/402673/how-to-search-inside-pdfs-with-windows-search
如果您的应用程序要从存储在数据库中的二进制文件中搜索文件内容,SQL 全文搜索功能可以为您实现这一点。
您只需要确保安装了所需的IFilter,并在存储二进制数据的表上创建全文索引。
但如果您的应用程序必须实时访问文件夹并搜索文件内容,您可能需要一个第三方工具,就像@maytham-ɯɐɥʇʎɐɯ所说的那样。