在C#开发过程中,从PDF文件中提取文字是一项非常常见的需求,比如需要批量处理合同PDF提取关键条款,或者从电子书PDF中提取内容做文本分析,都需要用到PDF文字提取的相关技术。目前C#生态中有多个成熟的库可以实现这个功能,其中iText7是应用最广泛、兼容性最好的选择之一。

准备工作
要实现C#提取PDF文字,首先需要安装对应的依赖库。这里以iText7为例,你可以通过NuGet包管理器安装,也可以直接在项目文件里添加包引用。安装完成后就可以调用对应的API完成文字提取操作。
安装iText7依赖
如果使用NuGet控制台安装,执行以下命令即可:
Install-Package itext7
如果是.NET Core或者.NET 5及以上版本的项目,也可以在项目文件里添加以下配置:
<PackageReference Include="itext7" Version="7.2.5" />
基础文字提取实现
下面是一段最基础的C#提取PDF所有文字的代码,这段代码可以读取指定路径的PDF文件,然后输出其中所有的文字内容。
using System;
using System.IO;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Listener;
namespace PdfTextExtractDemo
{
class Program
{
static void Main(string[] args)
{
// PDF文件路径
string pdfPath = @"D:test.pdf";
// 调用提取方法
string allText = ExtractPdfText(pdfPath);
// 输出提取的文字
Console.WriteLine(allText);
}
/// <summary>
/// 提取PDF文件中的所有文字
/// </summary>
/// <param name="pdfPath">PDF文件路径</param>
/// <returns>提取到的所有文字内容</returns>
static string ExtractPdfText(string pdfPath)
{
if (!File.Exists(pdfPath))
{
throw new FileNotFoundException("指定的PDF文件不存在", pdfPath);
}
// 用于存储提取的文字
using (StringWriter stringWriter = new StringWriter())
{
// 打开PDF文件
using (PdfReader pdfReader = new PdfReader(pdfPath))
{
using (PdfDocument pdfDocument = new PdfDocument(pdfReader))
{
// 遍历PDF的每一页
for (int pageNum = 1; pageNum <= pdfDocument.GetNumberOfPages(); pageNum++)
{
// 获取当前页
PdfPage page = pdfDocument.GetPage(pageNum);
// 创建文字提取策略
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
// 提取当前页的文字
string pageText = PdfTextExtractor.GetTextFromPage(page, strategy);
// 写入字符串写入器
stringWriter.Write(pageText);
// 如果不是最后一页,添加换行分隔
if (pageNum < pdfDocument.GetNumberOfPages())
{
stringWriter.WriteLine();
}
}
}
}
return stringWriter.ToString();
}
}
}
}
代码逻辑说明
上面的代码核心逻辑分为几个步骤:
- 首先校验传入的PDF文件路径是否存在,避免文件不存在导致的异常
- 使用
PdfReader打开目标PDF文件,再通过PdfDocument获取PDF的文档对象 - 遍历PDF的每一页,通过
PdfTextExtractor配合SimpleTextExtractionStrategy提取单页的文字内容 - 将所有页的文字拼接起来,最终返回完整的文字内容
进阶使用场景
提取指定页面的文字
如果只需要提取PDF中某几页的文字,可以修改遍历逻辑,指定需要提取的页码范围:
/// <summary>
/// 提取PDF指定页面的文字
/// </summary>
/// <param name="pdfPath">PDF文件路径</param>
/// <param name="startPage">起始页码(从1开始)</param>
/// <param name="endPage">结束页码</param>
/// <returns>提取到的文字内容</returns>
static string ExtractPdfTextByPageRange(string pdfPath, int startPage, int endPage)
{
if (!File.Exists(pdfPath))
{
throw new FileNotFoundException("指定的PDF文件不存在", pdfPath);
}
using (StringWriter stringWriter = new StringWriter())
{
using (PdfReader pdfReader = new PdfReader(pdfPath))
{
using (PdfDocument pdfDocument = new PdfDocument(pdfReader))
{
// 校验页码范围合法性
if (startPage < 1 || endPage > pdfDocument.GetNumberOfPages() || startPage > endPage)
{
throw new ArgumentException("页码范围不合法");
}
for (int pageNum = startPage; pageNum <= endPage; pageNum++)
{
PdfPage page = pdfDocument.GetPage(pageNum);
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
string pageText = PdfTextExtractor.GetTextFromPage(page, strategy);
stringWriter.Write(pageText);
if (pageNum < endPage)
{
stringWriter.WriteLine();
}
}
}
}
return stringWriter.ToString();
}
}
处理加密PDF的文字提取
如果PDF文件设置了打开密码,需要在创建PdfReader的时候传入密码参数:
// 假设PDF打开密码是123456
string pdfPassword = "123456";
using (PdfReader pdfReader = new PdfReader(pdfPath, new ReaderProperties().SetPassword(pdfPassword.GetBytes())))
{
// 后续操作和普通PDF一致
}
常见问题与解决方法
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 提取的文字顺序混乱 | PDF页面布局复杂,文字不是按阅读顺序排列 | 更换提取策略为LocationTextExtractionStrategy,该策略会按文字在页面中的位置排序 |
| 部分文字无法提取 | PDF中的文字是图片形式存储的 | 需要先对PDF页面做OCR识别,再提取文字,iText7本身不支持OCR功能,需要配合OCR库使用 |
| 提取时出现乱码 | PDF使用的字体编码不被iText7识别 | 确认PDF字体是否嵌入,或者尝试升级iText7到最新版本 |
注意事项
使用iText7提取PDF文字时,需要注意iText7的许可证问题,如果是商业项目使用,需要购买对应的商业许可证,非商业项目可以使用AGPL版本。另外提取文字时要做好异常处理,避免PDF文件损坏、路径错误等情况导致程序崩溃。
C#PDF文字提取iText7PDF_Reader文本解析修改时间:2026-07-07 18:42:32