0

0

C#读取PDF文本 C#如何提取PDF文件中的文字内容

月夜之吻

月夜之吻

发布时间:2026-02-10 08:09:34

|

685人浏览过

|

来源于php中文网

原创

推荐使用 iTextSharp.LGPLv2.Core(Install-Package iTextSharp.LGPLv2.Core)提取文本型 PDF;对扫描件需用 Ghostscript 转图 + Tesseract OCR;中文乱码优先检查字体嵌入,严重时换 PDFiumSharp。

c#读取pdf文本 c#如何提取pdf文件中的文字内容

用 iTextSharp 提取 PDF 文字最直接,但 NuGet 包名已变

iTextSharp 5.x 是老项目常用方案,但现在官方已停止维护,iTextSharp.LGPLv2.Core 是社区维护的兼容版,支持 .NET Core/.NET 5+。直接安装 Install-Package iTextSharp.LGPLv2.Core 即可,别用原版 iTextSharp(不支持新框架,且含 GPL 风险)。

提取逻辑简单:加载 PDF → 遍历每页 → 用 LocationTextExtractionStrategy 获取文本(它按阅读顺序拼接,比 SimpleTextExtractionStrategy 更可靠)。

示例关键代码:

using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;

PdfReader reader = new PdfReader("sample.pdf");
StringBuilder text = new StringBuilder();
for (int i = 1; i <= reader.NumberOfPages; i++)
{
    string pageText = PdfTextExtractor.GetTextFromPage(reader, i, new LocationTextExtractionStrategy());
    text.AppendLine(pageText);
}
reader.Close();
string fullText = text.ToString();

PDF 含扫描图或加密时,iTextSharp 会静默失败

iTextSharp 只能处理「文本型 PDF」——即内容本身是字符编码,不是图片。遇到扫描件(哪怕 OCR 过),它返回空字符串,也不报错。

判断方法:打开 PDF 用鼠标拖选文字,能复制就是文本型;不能复制、只能截图,就是图像型。

如果 PDF 被加密(即使没设密码,也可能有空密码或权限密码),PdfReader 构造时会抛 BadPasswordExceptionInvalidPdfException。需提前捕获并尝试用空字符串解密:

炉米Lumi
炉米Lumi

字节跳动推出的AI模型分享社区和模型训练平台

下载
  • new PdfReader("file.pdf", "".ToCharArray()) 可绕过常见空密码
  • 若仍失败,说明有真实密码,必须提供才能继续

需要 OCR 时,得换 Tesseract + 图像预处理

对扫描 PDF,先用 GhostscriptImageMagick 将每页转为 PNG/JPEG,再喂给 Tesseract(OCR 引擎)。

关键点:

  • Tesseract 的 eng.traineddata 语言包必须放在 tessdata 目录下,且初始化时指定路径:new TesseractEngine(@"./tessdata", "eng", EngineMode.Default)
  • 图像质量影响极大:PDF 转图建议 DPI ≥ 300,灰度化 + 二值化(去噪)后再识别,否则错字率飙升
  • Tesseract .NET 封装推荐用 IronOcr(商业但易用)或 Tesseract.NET(免费但需手动配环境)

中文 PDF 常见乱码,根源在字体嵌入和编码映射

iTextSharp 默认用系统编码解析文本,但中文 PDF 多用自定义字体编码(如 GB2312UTF-16BE 或 CID 字体),导致提取出“”或乱码。

缓解方式有限:

  • 确保 PDF 中文字体已完全嵌入(用 Adobe Acrobat 检查「属性 → 字体」)
  • 改用 UnicodeTextExtractionStrategy(部分版本支持,非标准类,需自行实现)
  • 更稳的路子是弃用 iTextSharp,换 PDFiumSharp(基于 Google PDFium)或 QuestPDF 生态中的解析模块,它们对 Unicode 支持更底层

真正难搞的是那些用图形指令画汉字(非文本对象)的 PDF,这种连 OCR 都救不了——本质就不是文本,只是看着像。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

464

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1519

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

634

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

801

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

772

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

182

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

86

2025.08.07

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

132

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 2.5万人学习

C# 教程
C# 教程

共94课时 | 9万人学习

C 教程
C 教程

共75课时 | 4.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号