pdfbox和pdfiumviewer均不能直接读取pdf文本:pdfbox是java库,.net下无官方移植版;pdfiumviewer仅为显示控件,不提供文本提取api;pdfiumsharp需启用cjk字体回退才能正确提取中文。

PdfBox 和 PdfiumViewer 在 C# 中都不能直接用于读取 PDF 文本——这不是配置问题,而是根本性定位错误。
PdfBox 是 Java 库,.NET 环境下没有官方 .NET 移植版;所谓 “C# 使用 PDFBox” 实际是靠 IKVM.NET 或 JNI 桥接 JVM,早已过时、不维护、不兼容 .NET 6+,运行时大概率报 ClassNotFoundException 或 JVM initialization failed。别试。
PdfiumViewer 是一个 WinForms/WPF PDF 显示控件,底层调用 PDFium,但它的 API 完全不暴露文本提取能力。它能渲染、缩放、翻页,但没有 GetText()、ExtractText() 或类似方法。想靠它“解析文字”,只能自己 hook 渲染后的位图再 OCR——纯属自找麻烦。
PdfiumSharp 提取文本时 GetText() 返回空或乱码
- 常见现象:中文 PDF 打开正常,
GetTextPage.GetText()却返回空字符串、问号或方块 - 根本原因不是编码错,而是 PDF 中文字体未嵌入,且
PDFDocument.Load()默认禁用中日韩字体回退 - 必须显式传入
PDFLoadOptions并设EnableCJKFontFallback = true
var options = new PDFLoadOptions { EnableCJKFontFallback = true };
using var doc = PDFDocument.Load("cn.pdf", options);
var page = doc.Pages[0];
var textPage = page.GetTextPage();
if (textPage != null) {
string text = textPage.GetText(); // 这才可能拿到中文
}
- 若仍为空,检查该 PDF 是否为扫描件:
page.TextPage为null表示无文字层 - 不要尝试用
RenderPageToBitmap+ Tesseract:慢、错字多、无法保留换行逻辑
iTextSharp.LGPLv2.Core 加载加密 PDF 报错或静默失败
-
PdfReader遇到带权限密码(哪怕为空)的 PDF,构造时就会抛BadPasswordException或InvalidPdfException - 正确做法是预判并传空密码尝试解密:
PdfReader reader;
try {
reader = new PdfReader("locked.pdf");
} catch {
reader = new PdfReader("locked.pdf", "".ToCharArray());
}
- 更稳妥的方式是先用
PdfReader.IsEncrypted()判断:- 若返回
true,再尝试new PdfReader(path, password)
- 若返回
- 注意:
iTextSharp.LGPLv2.Core完全不支持扫描型 PDF,遇到图片 PDF 会返回空字符串,且不报任何异常——必须靠人工拖选测试是否可复制文字来预判类型
FreeSpire.PDF 免费版页数限制与文本顺序陷阱
- 免费版明确限制最多处理 10 页,超限时
doc.LoadFromFile()不报错,但后续doc.Pages.Count会截断,且提取结果缺失后半部分 - 它默认按视觉阅读顺序拼接文字(比
PdfiumSharp的流式顺序更友好),但仍有坑:- 表格内文字可能被横向拉平(同一行的单元格内容连成一串)
- 页眉页脚和正文混在一起,无区分标识
-
PdfTextExtractOptions.IsSimpleExtraction = true可绕过布局感知,但会丢失段落换行
var options = new PdfTextExtractOptions(); options.IsSimpleExtraction = true; // 强制线性拼接,适合全文搜索 string rawText = extractor.ExtractText(options);
真正需要结构化提取(如识别标题、提取表格字段)时,这三个库都做不到开箱即用——必须自己基于字符坐标做聚类、排序、分栏,而这部分逻辑,恰恰是容易被跳过的复杂点。










