C#:PdfiumViewer 高效解析和操作 PDF 的技术指南

📄 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 是非常值得优先选择的方案

相关推荐
m5655bj6 小时前
使用 C# 实现 Excel 工作表拆分
windows·c#·excel·visual studio
2501_941877137 小时前
大规模系统稳定性建设方法论与工程实践分享
java·开发语言
2501_941820497 小时前
面向零信任安全与最小权限模型的互联网系统防护设计思路与多语言工程实践分享
开发语言·leetcode·rabbitmq
浩瀚地学7 小时前
【Java】面向对象进阶-接口
java·开发语言·经验分享·笔记·学习
2501_941802487 小时前
面向微服务限流、熔断与降级协同的互联网系统高可用架构与多语言工程实践分享
开发语言·python
2501_941875287 小时前
分布式系统中的安全权限与审计工程实践方法论经验总结与多语言示例解析分享
开发语言·rabbitmq
无限进步_7 小时前
【C语言】堆排序:从堆构建到高效排序的完整解析
c语言·开发语言·数据结构·c++·后端·算法·visual studio
雾岛听蓝7 小时前
STL 容器适配器:stack、queue 与 priority_queue
开发语言·c++
CSDN_RTKLIB7 小时前
【One Definition Rule】多编译单元定义同名全局变量
开发语言·c++
lang201509288 小时前
AQS共享锁的传播机制精髓
java·开发语言