提取文本 PDF csharp

PDF 文件格式很受欢迎,因为与其他文字处理文件格式相比,文件内容不易修改。但是,在 C# 中,您可以使用 Aspose.PDF for .NET API 从 PDF 文档中提取文本。在本文中,让我们探索使用 C# 从 PDF 文件中搜索和提取文本的多种可能性中的几种。以下是我们将在此博客中讨论的功能列表:

使用 C# 从整个 PDF 文档中提取文本

从 PDF 文档中读取文本内容是一项常用功能。使用 C#,您可以按照以下步骤从文档的所有页面中提取所有文本:

  1. 加载 PDF 文档
  2. 创建 TextAbsorber 对象
  3. 接受所有页面的吸收器
  4. 将提取的文本写入文件并保存

下面的代码片段遵循这些步骤,并展示了如何使用 C# 从整个 PDF 文档中提取文本:

// 打开 PDF 文档
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// 创建 TextAbsorber 对象以提取文本
TextAbsorber textAbsorber = new TextAbsorber();
// 接受所有页面的吸收器
pdfDocument.Pages.Accept(textAbsorber);
// 获取提取的文本
string extractedText = textAbsorber.Text;
// 创建作家并打开文件
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// 将一行文本写入文件
tw.WriteLine(extractedText);
// 关闭流
tw.Close();

在 C# 中从 PDF 中的特定页面中搜索和提取文本

在探索了文档级别的文本提取之后,让我们从 PDF 文档的特定页面中提取文本。只需按照以下步骤即可实现您的要求:

  1. 加载 PDF 文档
  2. 创建 TextAbsorber 对象
  3. 接受特定页面的吸收器
  4. 将提取的文本写入文件并保存

以下代码片段按照以下步骤使用 C# 从 PDF 文件的任何页面读取文本:

// 打开 PDF 文档
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// 访问 PDF 文档中的所需页面
Page page = pdfDocument.Pages[1];
// 创建 TextAbsorber 对象以提取文本
TextAbsorber textAbsorber = new TextAbsorber();
// 接受指定页面的吸收器
page.Accept(textAbsorber);
// 获取提取的文本
string extractedText = textAbsorber.Text;
// 创建作家并打开文件
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// 将一行文本写入文件
tw.WriteLine(extractedText);
// 关闭流
tw.Close();

在 C# 中从 PDF 页面的特定区域搜索和提取文本

让我们将这个文本提取更进一步。考虑从页面的特定区域查找一些文本。重要的是要在这里理解 Aspose.PDF for .NET 中的基本测量单位是点,其中 72 个点等于 1 英寸。此外,左下角被认为是页面的原点(0,0)。以下是从 PDF 文档中页面的特定区域或部分读取文本的步骤:

  1. 加载源 PDF 文档
  2. 创建 TextAbsorber 对象
  3. 设置 TextSearchOptions 并指定直角坐标
  4. 接受特定页面的吸收器
  5. 将提取的文本写入文件

下面的代码片段演示了使用 C# 从特定区域提取文本的这些步骤:

// 打开文档
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// 创建 TextAbsorber 对象以提取文本
TextAbsorber absorber = new TextAbsorber();
absorber.TextSearchOptions.LimitToPageBounds = true;
absorber.TextSearchOptions.Rectangle = new Aspose.Pdf.Rectangle(100, 200, 250, 350);
// 接受第一页的吸收体
pdfDocument.Pages[1].Accept(absorber);
// 获取提取的文本
string extractedText = absorber.Text;
// 创建作家并打开文件
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// 将一行文本写入文件
tw.WriteLine(extractedText);
// 关闭流
tw.Close();

使用 C# 使用正则表达式从 PDF 文件中搜索或提取特定文本

您可以从与某些模式匹配的 PDF 文档中提取特定文本。例如,您可能想要提取一些特定的单词或数字。为此,您需要设计一个正则表达式。 API 将利用该正则表达式在 PDF 文档中查找匹配的文本。以下步骤是从 PDF 文件中搜索和提取特定文本的指南:

  • 加载输入的 PDF 文档
  • 创建 TextAbsorber 对象
  • 设计并设置正则表达式以匹配某些文本
  • 循环遍历每个提取的文本片段

以下 C# 代码片段使用正则表达式在文档的所有页面中搜索包含 4 位数字的文本,例如 1999、2000 等。

// 打开文档
Document pdfDocument = new Document(dataDir + @"Test.pdf");
// 创建 TextAbsorber 对象以查找输入搜索短语的所有实例
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(@"\d{4}"); //like 1999-2020                                                                                                                // set text search option to specify regular expression usage
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.TextSearchOptions = textSearchOptions;
// 接受所有页面的吸收器
pdfDocument.Pages.Accept(textFragmentAbsorber);
// 获取提取的文本片段
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;     
// 遍历片段
foreach (TextFragment textFragment in textFragmentCollection)
{
    Console.WriteLine(textFragment.Text);
}

使用 C# 从 PDF 文档中的表格单元格中提取文本

从 PDF 页面上的表格中提取文本略有不同。在前面的示例中,我们一直在使用 TextAbsorber 类,但是从 Table 中提取文本有点不同。因此,您需要按照以下步骤从 Table 对象中提取文本:

  1. 加载源 PDF 文件
  2. 创建 TableAbsorber 类的对象
  3. 遍历AbsorbedTable
  4. 循环遍历表格每一行中的每个单元格

下面的代码片段遵循这些步骤,并使用 C# 有效地从 PDF 文档中的表格单元格中提取文本:

Document pdfDocument = new Document(dataDir + "Test.pdf");
TableAbsorber absorber = new TableAbsorber();
absorber.Visit(pdfDocument.Pages[1]);
foreach (AbsorbedTable table in absorber.TableList)
{
    foreach (AbsorbedRow row in table.RowList)
    {
        foreach (AbsorbedCell cell in row.CellList)
        {
            TextFragment textfragment = new TextFragment();
            TextFragmentCollection textFragmentCollection = cell.TextFragments;
            foreach (TextFragment fragment in textFragmentCollection)
            {
                Console.WriteLine(fragment.Text);
            }
        }
    }
}

使用 C# 从 PDF 文档中搜索和提取突出显示的文本

突出显示的文本在 PDF 文件中作为注释出现。它们包含标记文本,这使得它们与文档中的常规文本不同。以下步骤描述了如何使用 C# 读取突出显示的文本:

  1. 加载源文档
  2. 循环遍历所有注释
  3. 过滤器 TextMarkupAnnotation
  4. 检索突出显示的文本片段

以下是基于上述步骤的代码片段,可用于从 PDF 文件中获取高亮文本:

Document doc = new Document(dataDir + "ExtractHighlightedText.pdf");
// 循环遍历所有注释
foreach (Annotation annotation in doc.Pages[1].Annotations)
{
    // 过滤 TextMarkupAnnotation
    if (annotation is TextMarkupAnnotation)
    {
        TextMarkupAnnotation highlightedAnnotation = annotation as TextMarkupAnnotation;
        // 检索突出显示的文本片段
        TextFragmentCollection collection = highlightedAnnotation.GetMarkedTextFragments();
        foreach (TextFragment tf in collection)
        {
            // 显示突出显示的文本
            Console.WriteLine(tf.Text);
        }
    }
}

使用 C# 提取低内存消耗的 PDF 文本

以下是使用 C# 语言从 PDF 文档中提取文本时优化内存消耗的两种不同方法。

i) 使用 Reset() 和 FreeMemory() 方法

有时文本提取可能会消耗大量内存和处理器。可能当输入文件很大并且包含大量文本时。因为 TextFragmentAbsorber 对象将所有找到的文本片段存储在内存中。

因此,我们这里推荐的解决方案是在处理完每个页面后调用吸收器.Reset() 方法。此外,如果您只进行读取操作,那么您还可以使用 page.FreeMemory() 方法释放页面对象持有的内存。因此,您需要按照以下步骤来利用最少的资源:

  1. 加载源 PDF 文档
  2. 指定 TextEditOptions
  3. 阅读 TextFragment
  4. 调用 Reset() 方法
  5. 调用 FreeMemory() 方法

以下代码片段演示了使用 C# 从 PDF 文档中提取文本:

Document pdfDocument = new Document(dataDir + @"ITF-TTF Manual.pdf");
TextFragmentAbsorber absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
foreach (Page page in pdfDocument.Pages)
{
    page.Accept(absorber);
    //从片段中读取一些东西
    count += absorber.TextFragments.Count;
    absorber.Reset();
    page.FreeMemory();
    //GC.Collect();        
}

我们使用包含 450 页、24500 个文本片段以及大量光栅和矢量图像的巨大示例文件测试了此代码片段。该过程仅消耗了 500MB 的内存。这里的另一个提示是,您可以对 .NET 垃圾收集器收费,以将最大内存消耗减少到 250MB 左右,并额外花费 10 秒的处理时间。

ii) 使用 MemorySaving 枚举

Aspose.PDF for .NET API 支持在从 PDF 文件中读取文本时配置内存节省模式。 TextExtractionOptions.TextFormattingMode 枚举的目的是优化资源消耗。以下步骤总结了此方法需要遵循的步骤:

  1. 加载源 PDF 文件
  2. 创建 TextDevice 对象
  3. 设置 TextExtractionOptions
  4. 提取文本并将文本写入文件

下面的代码片段演示了使用 C# 的内存节省方法:

// 打开文档
Document pdfDocument = new Document(dataDir + "Test.pdf");
System.Text.StringBuilder builder = new System.Text.StringBuilder();
// 保存提取文本的字符串
string extractedText = "";
foreach (Page pdfPage in pdfDocument.Pages)
{
    using (MemoryStream textStream = new MemoryStream())
    {
        // 创建文本设备
        TextDevice textDevice = new TextDevice();

        // 设置文本提取选项 - 设置文本提取模式(原始或纯)
        TextExtractionOptions textExtOptions = new
        TextExtractionOptions(TextExtractionOptions.TextFormattingMode.MemorySaving);
        textDevice.ExtractionOptions = textExtOptions;
        // 转换特定页面并将文本保存到流中
        textDevice.Process(pdfPage, textStream);
        // 转换特定页面并将文本保存到流中
        textDevice.Process(pdfDocument.Pages[1], textStream);
        // 关闭内存流
        textStream.Close();
        // 从内存流中获取文本
        extractedText = Encoding.Unicode.GetString(textStream.ToArray());
    }
    builder.Append(extractedText);
}
dataDir = dataDir + "Memory_Text_Extracted.txt";
// 将提取的文本保存在文本文件中
File.WriteAllText(dataDir, builder.ToString());

结论

我们在本文中探索了许多有用的用例中的一些,使用 C# 和 Aspose.PDF for .NET API 从 PDF 文档中提取文本的可能性无穷无尽。您可以通过 API 文档 了解更多信息。如有任何疑问,请通过 免费支持论坛 与我们联系。

也可以看看