在pdf文件中搜索字符串

5
我正在进行一个学校项目,其中有几个PDF文件。我想要添加一个按姓名搜索的功能,只需输入学生的姓名,就可以打开所有与其姓名相关的PDF文件。最好的方法是什么?我在网上寻找解决方案,但只找到了iTextSharp,它让我更加困惑了。
这是否可行?也许有人可以给我一个教程链接或其他东西。 :) 非常感谢。
5个回答

4
使用iTextSharp。它是免费的,你只需要“itextsharp.dll”。

http://sourceforge.net/projects/itextsharp/

这里是一个简单的函数,用于从PDF中读取文本。
Public Shared Function GetTextFromPDF(PdfFileName As String) As String
    Dim oReader As New iTextSharp.text.pdf.PdfReader(PdfFileName)

    Dim sOut = ""

    For i = 1 To oReader.NumberOfPages
        Dim its As New iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy

        sOut &= iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(oReader, i, its)
    Next

    Return sOut
End Function

现在您可以轻松搜索这些文件。

2

PDF是非常复杂的规范,可能会创建许多变体,除非使用创建它的相同工具读取它(即使使用相同工具,通常也无法可靠解析)。有几个工具可以将PDF压缩成文本字符串(例如pdf2text),并且可能可以搜索这些内容,但这样做不可靠。

许多PDF工具只实现了规范的一部分。有些人建议最好的搜索PDF的方法是将其转换为图像,然后进行OCR。


2
我认为你的任务可以分为以下几个部分:
  • 建立PDF文件的索引
  • 编写代码,使用索引在进行搜索时找到相关的PDF文件
  • 编写代码,在找不到内容时打开找到的PDF或显示警告
要建立索引,您可以使用一些集成解决方案,例如Apache LuceneLucene.Net,或将每个PDF文件转换为文本并从文本中构建索引。
其他两个步骤相对简单,取决于第一步中使用的语言/技术。
由于您的问题标记与.NET相关,因此您可以尝试使用Docotic.Pdf库来建立索引(免责声明:我为Bit Miracle工作)。
Docotic.Pdf可用于提取PDF文件的纯文本或具有每个块的坐标的文本块集合。

0

根据您的系统,此任务可能很简单。

对于Windows用户工作站或数据库服务器,您可以使用具有缓存索引的iFilter,这将成为随着时间推移最快的方法。

传统上,Acrobat会在内部索引多个文件:

如果您处理大量相关的PDF文件,可以在Acrobat Pro中将它们定义为目录,从而为PDF文件生成PDF索引。搜索PDF索引而不是PDF本身可以显著加快搜索速度。

在Windows上,您可以安装任何iFilter并使用Windows本机文件搜索,甚至无需Pro或Acrobat,只需搜索栏,它也可以比完整的慢速搜索更快。

或者有许多应用程序可以混合搜索包含文本字符串的PDF文件,其中一些还可以缓存结果以供以后使用。请参见诸如Everything(未索引)或AgentRansack(已索引)之类的工具。

没有iFilter的系统需要采用不同的方法。


(注:该文本为计算机编程相关内容,翻译时需注意专业术语的准确性)

enter image description here

但是对于一个小的PDF语料库,最简单的跨平台调用程序是使用特定于操作系统的管道循环遍历目录或文件列表,并使用pdftotext进行转换。

enter image description here


0
我倾向于使用Apache PDFBox(用Java编写,但在.Net 5+以及.Net框架中也可用)。
要使用它,请使用NuGet IKVM:
Install-Package IKVM -Version 8.2.0

下载所需的jar文件并在项目中引用它们:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>disable</ImplicitUsings>
    <Nullable>disable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="IKVM" Version="8.2.0" />
  </ItemGroup>

  <ItemGroup>
    <IkvmReference Include="commons-logging-1.2.jar" />
    <IkvmReference Include="fontbox-3.0.0-alpha3.jar" >
        <References>commons-logging-1.2.jar</References>
    </IkvmReference>
    <IkvmReference Include="pdfbox-3.0.0-alpha3.jar" >
        <References>commons-logging-1.2.jar;fontbox-3.0.0-alpha3.jar</References>
    </IkvmReference>
   </ItemGroup>

</Project>

然后在C#中使用PDFBox:

using org.apache.pdfbox.io;
using org.apache.pdfbox.pdfparser;
using org.apache.pdfbox.text;

public class Program
{
    public static string getTextFromPdf(string pdfPath)
    {
        using(var input = new RandomAccessReadBufferedFile(pdfPath))
        {
            var parser = new PDFParser(input);
            var pdDoc = parser.parse();
            var pdfStripper = new PDFTextStripper();
            return pdfStripper.getText(pdDoc);
        }
    }

    public static void Main(string[] args)
    {
        var res = getTextFromPdf(@"C:\Temp\test.pdf");
        System.Console.WriteLine(res);
    }
}

返回的字符串可以使用正则表达式或类似工具进行搜索。

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