C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# Spire.PDF提取PDF文本

C#使用Spire.PDF从PDF中提取文本的实战指南

作者:缺点内向

在处理PDF文档时,经常需要从中提取文本内容用于数据分析或搜索入库。使用Spire.PDF for .NET,只需几行C#代码即可精准提取PDF中的文本,支持保留格式和批量处理,轻松解决文本提取需求。

引言

在处理PDF文档时,经常需要从中提取文本内容用于数据分析或搜索入库。使用Spire.PDF for .NET,只需几行C#代码即可精准提取PDF中的文本,支持保留格式和批量处理,轻松解决文本提取需求。

为什么选择 Spire.PDF 进行文本提取?

Spire.PDF 是由 e-iceblue 公司开发的一款专业的 PDF 组件,专为 .NET 平台设计,支持在 C#、VB.NET 等语言中创建、读取、编辑、转换和打印 PDF 文档。在文本提取方面,Spire.PDF 展现出诸多独特优势:

Spire.PDF 文本提取实战:基础用法

现在,让我们通过具体的 C# 代码示例,深入了解如何使用 Spire.PDF 进行文本提取。

2.1 环境准备与库安装

首先,你需要在你的 .NET 项目中安装 Spire.PDF 库。最简单的方式是通过 NuGet 包管理器:

Install-Package Spire.PDF

或者在 Visual Studio 的 NuGet 包管理器中搜索 "Spire.PDF" 并安装。

2.2 提取整页文本

这是最常见的文本提取场景,即提取 PDF 文档中每一页的所有文本内容。

using Spire.Pdf;
using System.Text; // 引入 StringBuilder 命名空间

class Program
{
    static void Main(string[] args)
    {
        // 1. 加载 PDF 文档
        PdfDocument doc = new PdfDocument();
        doc.Load("Sample.pdf"); // 替换为你的 PDF 文件路径

        StringBuilder fullText = new StringBuilder();

        // 2. 遍历文档中的每一页
        foreach (PdfPageBase page in doc.Pages)
        {
            // 3. 提取当前页的所有文本
            string textOnPage = page.ExtractText();
            fullText.AppendLine(textOnPage);

            // 可选:打印每页文本
            // Console.WriteLine($"--- Page {page.PageIndex + 1} ---");
            // Console.WriteLine(textOnPage);
        }

        // 4. 将所有文本保存到文件或进行其他处理
        System.IO.File.WriteAllText("ExtractedFullText.txt", fullText.ToString());
        Console.WriteLine("文本已成功提取并保存到 ExtractedFullText.txt");

        // 5. 释放资源
        doc.Close();
    }
}

代码解析:

2.3 提取指定区域文本

有时我们只需要 PDF 页面中某个特定区域的文本,例如一个表格或者某个数据块。Spire.PDF 允许我们通过定义一个矩形区域来精确提取文本。

using Spire.Pdf;
using Spire.Pdf.Graphics; // 引入 RectangleF 命名空间
using Spire.Pdf.Texts; // 引入 PdfTextExtractor 命名空间
using System.Drawing; // 引入 Color 命名空间

class Program
{
    static void Main(string[] args)
    {
        // 1. 加载 PDF 文档
        PdfDocument doc = new PdfDocument();
        doc.Load("Sample.pdf"); 

        // 2. 获取第一页(或其他指定页)
        PdfPageBase page = doc.Pages[0];

        // 3. 定义要提取文本的矩形区域
        // RectangleF(x, y, width, height)
        // x, y 是矩形左上角的坐标,width, height 是矩形的宽度和高度。
        // PDF 坐标系的原点通常在左下角或左上角,具体取决于库的实现。
        // Spire.PDF 默认是左上角为 (0,0),Y轴向下。
        RectangleF extractArea = new RectangleF(80, 180, 500, 200); // 示例坐标和尺寸

        // 4. 创建文本提取选项
        PdfTextExtractOptions options = new PdfTextExtractOptions();
        options.ExtractArea = extractArea;

        // 5. 使用 PdfTextExtractor 提取指定区域文本
        PdfTextExtractor extractor = new PdfTextExtractor(page);
        string extractedText = extractor.ExtractText(options);

        Console.WriteLine($"从指定区域提取的文本:\n{extractedText}");

        // 6. 释放资源
        doc.Close();
    }
}

代码解析:

2.4 提取特定格式文本

Spire.PDF 还提供了更高级的文本提取能力,例如提取被高亮(highlight)的文本。这在处理批注和审阅过的文档时非常有用。

using Spire.Pdf;
using Spire.Pdf.Annotations; // 引入 PdfTextMarkupAnnotationWidget 命名空间
using Spire.Pdf.Graphics;
using Spire.Pdf.Texts;
using System.Drawing;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        PdfDocument doc = new PdfDocument();
        doc.Load("SampleWithHighlight.pdf"); // 替换为包含高亮文本的 PDF 文件

        PdfPageBase page = doc.Pages[0]; // 获取第一页
        StringBuilder stringBuilder = new StringBuilder();
        PdfTextExtractor pdfTextExtractor = new PdfTextExtractor(page);

        // 遍历页面上的所有批注
        for (int i = 0; i < page.Annotations.Count; i++)
        {
            if (page.Annotations[i] is PdfTextMarkupAnnotationWidget textMarkupAnnotation)
            {
                // 如果是文本标记批注(如高亮、删除线等)
                // 获取高亮区域的边界
                PdfTextExtractOptions pdfTextExtractOptions = new PdfTextExtractOptions();
                pdfTextExtractOptions.ExtractArea = textMarkupAnnotation.Bounds;
                
                // 提取高亮区域的文本
                string highlightedText = pdfTextExtractor.ExtractText(pdfTextExtractOptions);
                stringBuilder.AppendLine(highlightedText);

                // 可选:获取高亮颜色
                Color color = textMarkupAnnotation.TextMarkupColor;
                Console.WriteLine($"检测到高亮文本: '{highlightedText}' (颜色: {color})");
            }
        }
        
        System.IO.File.WriteAllText("ExtractedHighlightedText.txt", stringBuilder.ToString());
        Console.WriteLine("高亮文本已成功提取并保存到 ExtractedHighlightedText.txt");

        doc.Close();
    }
}

代码解析:

进阶技巧与常见问题解决

在实际应用中,我们可能会遇到一些更复杂的情况,以下是一些进阶技巧和常见问题解决方案。

3.1 处理乱码与编码问题

文本提取后出现乱码通常是由于编码不匹配造成的。Spire.PDF 在内部对多种编码有良好支持,但如果遇到特殊情况,可以尝试以下方法:

提示: Spire.PDF 在处理多语言和复杂编码方面表现优秀,通常无需手动干预。如果出现乱码,首先确认 PDF 文件本身是否正常,或尝试更新 Spire.PDF 到最新版本。

3.2 保持文本布局与结构

仅仅提取文本有时是不够的,我们还需要了解文本在页面上的位置、大小、字体等布局信息,以便更好地还原原始文档结构。

Spire.PDF 提供了 ExtractText(bool) 重载方法或 PdfTextExtractor 类,可以获取更详细的文本元素信息,而不仅仅是纯文本字符串。例如,通过 PdfTextExtractor 我们可以获取 TextLineTextWord 对象,它们包含了文本的坐标、字体、大小等属性。

using Spire.Pdf;
using Spire.Pdf.Texts;
using System.Drawing; // 用于 RectangleF

class Program
{
    static void Main(string[] args)
    {
        PdfDocument doc = new PdfDocument();
        doc.Load("Sample.pdf");

        PdfPageBase page = doc.Pages[0];
        PdfTextExtractor extractor = new PdfTextExtractor(page);

        // 获取页面中的所有文本行
        TextLine[] textLines = extractor.ExtractTextLines();

        foreach (TextLine line in textLines)
        {
            Console.WriteLine($"行文本: {line.Text} (位置: {line.Bounds})");
            foreach (TextWord word in line.Words)
            {
                Console.WriteLine($"  单词: {word.Text} (位置: {word.Bounds}, 字体: {word.FontName}, 大小: {word.FontSize})");
            }
        }

        doc.Close();
    }
}

代码解析:

利用这些信息,你可以根据需求重新构建文本的布局,例如生成 HTML、XML 或其他结构化数据。

3.3 性能优化建议

对于处理大量或大型 PDF 文件,性能是一个关键考量。

到此这篇关于C#使用Spire.PDF从PDF中提取文本的实战指南的文章就介绍到这了,更多相关C# Spire.PDF提取PDF文本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文