📄 1、简述
在 C# 项目中处理 PDF 是一个高频但复杂的需求,例如:
- 📑 预览 PDF 页面
- 🖼️ 将 PDF 转为图片(JPG / PNG / TIFF)
- 📐 获取 PDF 页数、尺寸信息
- 🔍 提取文本内容
- 🧾 配合 OCR、归档、批处理系统使用
相比 iText(偏编辑/生成)或 PDFBox(Java),
PdfiumViewer 更适合"解析 + 渲染"场景,尤其在 Windows 桌面程序(WinForms / WPF)中表现非常优秀。

2、什么是 PdfiumViewer?
PdfiumViewer 是一个基于 Google PDFium 引擎 的 .NET 封装库,主要特点:
✅ 高性能 PDF 渲染
✅ 原生支持 PDF → Bitmap
✅ API 简洁,易上手
✅ 非商业许可(免费)
⚠️ 仅支持 Windows(依赖 pdfium.dll)
适合以下场景:
- WinForms / WPF PDF 预览器
- PDF 批量转图片
- PDF 页面级解析
- 与 OpenCV / OCR(Tesseract)联动
PdfiumViewer 的核心能力:
| 功能 | 是否支持 |
|---|---|
| 获取 PDF 页数 | ✅ |
| 渲染为 Bitmap | ✅ |
| 指定 DPI 渲染 | ✅ |
| 提取文本 | ✅ |
| 页面裁切 | ✅ |
| 编辑 PDF | ❌(非设计目标) |
3、安装 PdfiumViewer
1️⃣ NuGet 安装
bash
dotnet add package PdfiumViewer
2️⃣ 引入 pdfium.dll(关键)
PdfiumViewer 必须依赖 pdfium.dll:
- x86 / x64 需与程序一致
常用来源:
- PdfiumViewer.Native.x86
- PdfiumViewer.Native.x64
推荐方式:
bash
dotnet add package PdfiumViewer.Native.x64
⚠️ WinForms / WPF / Console 都适用
4、实践样例
csharp
using PdfiumViewer;
using (var document = PdfDocument.Load("sample.pdf"))
{
int pageCount = document.PageCount;
Console.WriteLine($"PDF 页数:{pageCount}");
}
📌 这是所有 PDF 处理流程的起点。
实战一:PDF 渲染为 Bitmap(核心功能)
单页转图片
csharp
using PdfiumViewer;
using System.Drawing;
using (var document = PdfDocument.Load("sample.pdf"))
{
int pageIndex = 0;
// 300 DPI 高清渲染
var image = document.Render(
pageIndex,
300,
300,
PdfRenderFlags.Annotations
);
image.Save("page1.png", System.Drawing.Imaging.ImageFormat.Png);
}
📌 参数说明:
| 参数 | 含义 |
|---|---|
| pageIndex | 从 0 开始 |
| dpiX / dpiY | 分辨率(建议 200--300) |
| RenderFlags | 是否包含注释 |
实战二:PDF 全量转图片(批量处理)
csharp
using PdfiumViewer;
using System.Drawing.Imaging;
void ConvertPdfToImages(string pdfPath, string outputDir)
{
using var document = PdfDocument.Load(pdfPath);
Directory.CreateDirectory(outputDir);
for (int i = 0; i < document.PageCount; i++)
{
using var image = document.Render(i, 300, 300, PdfRenderFlags.Annotations);
string path = Path.Combine(outputDir, $"page_{i + 1}.jpg");
image.Save(path, ImageFormat.Jpeg);
}
}
📌 常用于:
- PDF → OCR
- PDF → 归档图片
- PDF → OpenCV 图像处理流水线
实战三:获取 PDF 页面尺寸(像素 / 物理尺寸)
csharp
using PdfiumViewer;
using var document = PdfDocument.Load("sample.pdf");
var size = document.PageSizes[0];
Console.WriteLine($"宽:{size.Width} pt");
Console.WriteLine($"高:{size.Height} pt");
PDF 中单位是 Point(1 pt = 1/72 inch)
转为像素:
csharp
int dpi = 300;
int widthPx = (int)(size.Width / 72 * dpi);
int heightPx = (int)(size.Height / 72 * dpi);
📌 对齐 OpenCV、图像裁切时非常关键。
实战四:提取 PDF 文本内容
csharp
using PdfiumViewer;
using var document = PdfDocument.Load("sample.pdf");
string text = document.GetPdfText(0);
Console.WriteLine(text);
⚠️ 注意事项:
- 仅适用于 文本型 PDF
- 扫描件(图片 PDF)需 OCR
- 表格结构会被打平
📌 常见用途:
- 关键字定位
- 文档分类
- 索引构建
实战五:结合 WinForms 显示 PDF 页面
csharp
using PdfiumViewer;
PdfDocument document = PdfDocument.Load("sample.pdf");
pictureBox1.Image = document.Render(
0,
pictureBox1.Width,
pictureBox1.Height,
true
);
📌 实际项目中可实现:
- 上一页 / 下一页
- 缩放
- 滚动预览
实战六:PDF 页面裁切后渲染(区域提取)
csharp
using PdfiumViewer;
using System.Drawing;
using var document = PdfDocument.Load("sample.pdf");
var pageSize = document.PageSizes[0];
RectangleF crop = new RectangleF(
0,
0,
pageSize.Width / 2,
pageSize.Height / 2
);
using var image = document.Render(
0,
300,
300,
crop,
PdfRenderFlags.None
);
image.Save("crop.png");
📌 常用于:
- 表格区域识别
- 公章 / 签名区域截取
- OCR 局部增强
5、总结
PdfiumViewer 是 C# 世界中处理 PDF 解析与渲染的利器:
- 简单
- 高效
- 稳定
- 非商业免费
如果你的项目涉及:
- PDF → 图片
- OCR 前处理
- WinForms / WPF 桌面工具
- 批量文档处理
👉 PdfiumViewer 是非常值得优先选择的方案。