C#使用PdfiumViewer库处理PDF文件的实践方法

 更新时间:2026年01月05日 09:15:14   作者:拾荒的小海螺  
PdfiumViewer 是一个基于 Google PDFium 引擎 的 .NET 封装库,在 C# 项目中处理 PDF 是一个高频但复杂的需求,因此本文介绍了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 安装

dotnet add package PdfiumViewer

2、引入 pdfium.dll(关键)

PdfiumViewer 必须依赖 pdfium.dll

  • x86 / x64 需与程序一致

常用来源:

  • PdfiumViewer.Native.x86
  • PdfiumViewer.Native.x64

推荐方式:

dotnet add package PdfiumViewer.Native.x64

WinForms / WPF / Console 都适用

4、实践样例

using PdfiumViewer;

using (var document = PdfDocument.Load("sample.pdf"))
{
    int pageCount = document.PageCount;
    Console.WriteLine($"PDF 页数:{pageCount}");
}

这是所有 PDF 处理流程的起点。

实战一:PDF 渲染为 Bitmap(核心功能)

单页转图片

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 全量转图片(批量处理)

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 页面尺寸(像素 / 物理尺寸)

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)

转为像素:

int dpi = 300;
int widthPx = (int)(size.Width / 72 * dpi);
int heightPx = (int)(size.Height / 72 * dpi);

对齐 OpenCV、图像裁切时非常关键。

实战四:提取 PDF 文本内容

using PdfiumViewer;

using var document = PdfDocument.Load("sample.pdf");

string text = document.GetPdfText(0);
Console.WriteLine(text);

注意事项:

  • 仅适用于 文本型 PDF
  • 扫描件(图片 PDF)需 OCR
  • 表格结构会被打平

常见用途:

  • 关键字定位
  • 文档分类
  • 索引构建

实战五:结合 WinForms 显示 PDF 页面

using PdfiumViewer;

PdfDocument document = PdfDocument.Load("sample.pdf");

pictureBox1.Image = document.Render(
    0,
    pictureBox1.Width,
    pictureBox1.Height,
    true
);

实际项目中可实现:

  • 上一页 / 下一页
  • 缩放
  • 滚动预览

实战六:PDF 页面裁切后渲染(区域提取)

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

以上就是C#使用PdfiumViewer库处理PDF文件的实践方法的详细内容,更多关于C# PdfiumViewer处理PDF文件的资料请关注脚本之家其它相关文章!

相关文章

  • C#中Arraylist的sort函数用法实例分析

    C#中Arraylist的sort函数用法实例分析

    这篇文章主要介绍了C#中Arraylist的sort函数用法,较为详细的分析了ArrayList的sort函数的功能、定义及具体使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • C#之关于Base64简单加密与解密方式

    C#之关于Base64简单加密与解密方式

    这篇文章主要介绍了C#之关于Base64简单加密与解密方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • C#形状原点变换的方法

    C#形状原点变换的方法

    这篇文章主要介绍了C#形状原点变换的方法,涉及C#图形绘制中原点变换的实现技巧,需要的朋友可以参考下
    2015-06-06
  • C#拷贝文件简单实现方法

    C#拷贝文件简单实现方法

    这篇文章主要介绍了C#拷贝文件简单实现方法,主要分析了FileInfo类中CopyTo方法针对文件复制的操作技巧,非常简单实用,需要的朋友可以参考下
    2015-04-04
  • 如何在C#中使用Dapper ORM

    如何在C#中使用Dapper ORM

    这篇文章主要介绍了如何在C#中使用Dapper ORM,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • c#的dllimport使用方法详解

    c#的dllimport使用方法详解

    DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息
    2014-01-01
  • 详解C#用new和override来实现抽象类的重写区别

    详解C#用new和override来实现抽象类的重写区别

    本篇文章主要介绍了详解C#用new和override来实现抽象类的重写区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
    2017-02-02
  • C#中的DataTable查询实战教程

    C#中的DataTable查询实战教程

    这篇文章主要介绍了C#中的DataTable查询实战教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • MVVM简化的Messager类实例代码

    MVVM简化的Messager类实例代码

    这篇文章主要给大家介绍了关于MVVM简化的Messager类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • C#绘制中国象棋棋盘

    C#绘制中国象棋棋盘

    这篇文章主要为大家详细介绍了C#绘制中国象棋棋盘,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01

最新评论