手动从 PDF 文件中提取文本往往繁琐、易错且低效,尤其在处理大量文档或复杂布局文件时问题更突出。这是因为 PDF 文件基于坐标存储内容,而非线性文本流 —— 若缺乏专业工具,很难提取出结构化或易读的文本。对于 C# .NET 开发者而言,实现 PDF 文本提取自动化是简化工作流的关键:无论是文档处理、内容索引,还是数据迁移、数字归档,自动化提取都能大幅提升效率。
本文将详细介绍如何通过 C# 与 Spire.PDF for .NET(一款功能强大的 PDF 读取与处理库)从PDF中读取文本,包含从基础到高级的完整方案,附可直接复用的代码示例与常见问题解答。
目录
1. 为何在 .NET 中使用 Spire.PDF 提取文本?
Spire.PDF for .NET 是一款功能丰富且对开发者友好的库,支持在 .NET 应用程序中无缝提取 PDF 文本。其优势如下:
- 精准保留布局:维持原文的布局、间距和阅读顺序。
- 详细提取能力:提取文本的同时,可获取位置、大小等元数据。
- 无需依赖 Adobe:无需 Adobe Acrobat 或其他第三方工具即可独立运行。
- 快速集成:简洁的 API 和详尽的文档,助力加快开发速度。
安装
开始前,需通过以下方式在项目中安装该库:
- 通过NuGet安装(推荐):
Install-Package Spire.PDF
- 或下载 DLL 文件,在解决方案中手动引用。
若需要完整地体验 Spire.PDF for .NET 的全部功能并移除水印,您可以点击申请免费的30天试用许可证。
2. PDF 文本提取(基础示例)
适用于需获取 PDF 全部文本的场景(如文档全文检索、内容分析)。通过 PdfTextExtractor
(PDF 文本提取器)遍历所有页面,提取文本后保存到 TXT 文件,同时保留原格式。
C# 代码示例
using Spire.Pdf;
using Spire.Pdf.Texts;
using System.IO;
using System.Text;
namespace ExtractAllTextFromPDF
{
internal class Program
{
static void Main(string[] args)
{
// 创建 PDF 文档实例
PdfDocument pdf = new PdfDocument();
// 加载 PDF 文件
pdf.LoadFromFile("示例.pdf");
// 初始化 StringBuilder 以存储提取的文本
StringBuilder extractedText = new StringBuilder();
// 遍历 PDF 中的每一页
foreach (PdfPageBase page in pdf.Pages)
{
// 为当前页面创建 PdfTextExtractor 实例
PdfTextExtractor extractor = new PdfTextExtractor(page);
// 设置提取选项
PdfTextExtractOptions option = new PdfTextExtractOptions
{
IsExtractAllText = true // 提取当前页面的所有文本
};
// 从当前页面提取文本
string text = extractor.ExtractText(option);
// 将提取的文本追加到StringBuilder中
extractedText.AppendLine(text);
}
// 将提取的文本保存到文本文件
File.WriteAllText("提取文本.txt", extractedText.ToString());
// 关闭 PDF 文档
pdf.Close();
}
}
}
3. PDF 文本提取进阶选项
Spire.PDF 不仅支持基础的全文提取,还能满足高级使用场景,例如从特定页面提取文本、从指定区域提取内容,以及获取文本布局细节(如位置和尺寸)。本节将通过实际示例介绍这些功能。
3.1 从单个 PDF 页面提取文本
适用于只需特定页面文本的场景(如提取合同中的 “条款页”、报告中的 “数据摘要页”)。通过 Pages[index]
指定页面(注:PDF 页面索引从 0 开始,索引 0 = 第一页,索引 1 = 第二页)。
C# 代码示例
using Spire.Pdf;
using Spire.Pdf.Texts;
using System.IO;
namespace ExtractTextFromIndividualPages
{
internal class Program
{
static void Main(string[] args)
{
// 创建 PDF 文档实例
PdfDocument pdf = new PdfDocument();
// 加载 PDF 文件
pdf.LoadFromFile("AI数字人.pdf");
// 获取要提取文本的页面(例如,索引1对应第二页,注:索引从0开始)
PdfPageBase page = pdf.Pages[1];
// 为选中的页面创建PdfTextExtractor实例
PdfTextExtractor extractor = new PdfTextExtractor(page);
// 设置提取选项
PdfTextExtractOptions option = new PdfTextExtractOptions
{
IsExtractAllText = true
};
// 从指定页面提取文本
string text = extractor.ExtractText(option);
// 将提取的文本保存到文本文件
File.WriteAllText("提取指定页面文本.txt", text);
// 关闭 PDF 文档
pdf.Close();
}
}
}
3.2 从 PDF 页面的指定区域读取文本
适用于需精准提取局部内容的场景(如提取页眉、页脚、表格区域的文本)。通过 PdfTextExtractOptions.ExtractArea
设置矩形提取区域,以限制提取范围。
C# 代码示例
using Spire.Pdf;
using Spire.Pdf.Texts;
using System.IO;
using System.Drawing;
namespace ExtractTextFromDefinedArea
{
internal class Program
{
static void Main(string[] args)
{
// 创建 PDF 文档实例
PdfDocument pdf = new PdfDocument();
// 加载 PDF 文件
pdf.LoadFromFile("AI数字人.pdf");
// 获取第二页(索引1对应第二页)
PdfPageBase page = pdf.Pages[1];
// 为选中的页面创建 PdfTextExtractor 实例
PdfTextExtractor textExtractor = new PdfTextExtractor(page);
// 设置提取选项(指定矩形区域)
PdfTextExtractOptions extractOptions = new PdfTextExtractOptions
{
// 矩形区域参数:X坐标、Y坐标、宽度、高度
ExtractArea = new RectangleF(0, 0, 890, 170)
};
// 从指定矩形区域提取文本
string text = textExtractor.ExtractText(extractOptions);
// 将提取的文本保存到文本文件
File.WriteAllText("Extracted.txt", text);
// 关闭 PDF 文档
pdf.Close();
}
}
}
3.3 获取文本位置和尺寸信息
适用于需文本布局分析的场景(如 PDF 批注、内容叠加、格式还原)。通过 PdfTextFinder
(PDF 文本查找器)获取每个文本片段的 Bounds
(边界矩形),包含位置(X/Y 坐标)和尺寸(宽 / 高)。
C# 代码示例
using Spire.Pdf;
using Spire.Pdf.Texts;
using System;
using System.Collections.Generic;
using System.Drawing;
namespace ExtractTextWithPositionAndSize
{
class Program
{
static void Main(string[] args)
{
// 加载 PDF 文档
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("示例.pdf");
// 遍历文档的每一页
for (int i = 0; i < pdf.Pages.Count; i++)
{
PdfPageBase page = pdf.Pages[i];
// 为当前页面创建 PdfTextFinder 实例
PdfTextFinder finder = new PdfTextFinder(page);
// 查找页面上的所有文本片段
List<PdfTextFragment> fragments = finder.FindAllText();
Console.WriteLine($"第 {i + 1} 页:");
// 遍历每个文本片段
foreach (PdfTextFragment fragment in fragments)
{
// 提取文本内容
string text = fragment.Text;
// 获取包含位置和大小信息的边界矩形数组
RectangleF[] rects = fragment.Bounds;
Console.WriteLine($"文本:\"{text}\"");
// 遍历当前文本片段的每个边界矩形
foreach (var rect in rects)
{
Console.WriteLine($"位置:({rect.X}, {rect.Y}),尺寸:({rect.Width} × {rect.Height})");
}
Console.WriteLine(); // 空行分隔不同文本片段
}
}
}
}
}
4. 结论
Spire.PDF for .NET 为 C# 开发者提供了全场景的 PDF 文本提取能力:
- 基础需求:全文提取、单页提取;
- 进阶需求:指定区域提取;
- 高级需求:文本位置 / 尺寸 / 字体信息提取。
结合这些能力,可轻松构建文档自动化工具(如 PDF 解析器、智能归档系统),大幅提升 PDF 处理效率。
5. 常见问题(FAQ)
Q1:Spire.PDF 能否从受密码保护的 PDF 中提取文本?
答:可以。加载文件时通过重载的 LoadFromFile
方法传入密码即可,示例:
// 加载带密码的PDF(第一个参数:文件路径,第二个参数:密码)
pdf.LoadFromFile("ProtectedSample.pdf", "your_pdf_password");
Q2:Spire.PDF 支持批量提取吗?
答:完全支持。通过 Directory.GetFiles
遍历文件夹中的所有 PDF,批量应用提取逻辑。
Q3:除了文本,能否提取 PDF 中的图片或表格??
答:本文虽以文本提取为核心,但 Spire.PDF 也支持提取图片;若需提取表格,可结合额外逻辑实现表格检测。
Q5:Spire.PDF 能否从扫描件(图像型 PDF)中提取文本?
答:扫描件 PDF,需先通过 OCR(光学字符识别) 转换为可编辑文本。Spire.PDF 本身无内置 OCR,但可与 Spire.OCR for .NET 配合使用,实现从图片中提取文本。