前言
PDF转图片这个需求,相信很多人都遇到过:想把PDF中的某页做成PPT素材、批量提取文档截图、把报告转成图片方便分享……网上的在线工具要么有水印,要么限制页数,要么担心文件隐私泄露;还有一些像我们在做医院项目对接时需要将我们的PDF报告转成图片传输到HIS系统,这时候连线上工具都用不了了。
其实,自己写一个并不难。
今天我就用C#和一款免费开源的PDF渲染库,带你从头打造一个属于自己的PDF转图片工具。完全免费、无广告、无页数限制、不上传文件(安全),而且代码量不到150行。
一、核心库介绍:PdfiumViewer
在动手之前,先认识一下今天的“主角”。
它是什么?
PdfiumViewer 是一个基于 Google Chromium 浏览器底层 PDF 引擎(PDFium)的 .NET 开源库。
简单说:Chrome 浏览器打开 PDF 用的那套渲染引擎,被封装成了 .NET 可以直接调用的版本。
为什么选它?
安装方式
Install-Package PdfiumViewer# 64位系统Install-Package PdfiumViewer.Native.x86_64.v8-x64# 32位系统Install-Package PdfiumViewer.Native.x86.v8-x86
二、工具功能一览

三、核心代码详解
初始化:设置默认值
publicForm1(){InitializeComponent();// 格式下拉框comboBox_Format.Items.Add("PNG");comboBox_Format.Items.Add("JPEG");comboBox_Format.SelectedIndex = 0;// 质量数字框(JPEG压缩质量)numericUpDown_Quality.Minimum = 1;numericUpDown_Quality.Maximum = 100;numericUpDown_Quality.Value = 90;}
转换入口(异步+防卡死)
privateasyncvoidbutton1_Click(object sender, EventArgs e){// 参数验证(路径存在、宽高DPI有效等)if (!ValidateInputs()) return;// 获取用户选择:格式、质量string format = comboBox_Format.SelectedItem.ToString();long quality = (format == "PNG") ? 0 : (long)numericUpDown_Quality.Value;// 界面锁定,防止重复点击button1.Enabled = false;this.Cursor = Cursors.WaitCursor;try{// 后台线程执行,UI不会假死await Task.Run(() => ConvertPdfToImages(pdfPath, outPutDir, width, height, dpi, format, quality));MessageBox.Show("转换完成!");}catch (Exception ex){MessageBox.Show($"转换失败:{ex.Message}");}finally{button1.Enabled = true;this.Cursor = Cursors.Default;}}
注意:WinForms中异步操作必须用async/await + Task.Run,否则转换大文件时界面会卡成“未响应”。
核心转换逻辑(PdfiumViewer 发威的地方)
///<summary>/// 核心转换逻辑(在后台线程运行)///</summary>privatevoidConvertPdfToImages(string pdfPath, string outputPath, int width, int height, int dpi, string format, long quality){// 确保输出目录存在if (!Directory.Exists(outputPath)){Directory.CreateDirectory(outputPath);}// 更安全的文件名处理:去除扩展名string fileNameWithoutExt = Path.GetFileNameWithoutExtension(pdfPath);// 确定文件扩展名string extension = format.ToUpper() == "JPEG" ? ".jpg" : ".png";ImageFormat imageFormat = format.ToUpper() == "JPEG" ? ImageFormat.Jpeg : ImageFormat.Png;// 加载 PDF 文档using (var document = PdfDocument.Load(pdfPath)){for (int i = 0; i < document.PageCount; i++){// 渲染页面// PdfRenderFlags.Annotations 确保注释也被渲染using (var image = document.Render(i, width, height, dpi, dpi, PdfRenderFlags.Annotations)){// 生成输出路径string outputFileName = $"{fileNameWithoutExt}_page_{i + 1}{extension}";string outputFilePath = Path.Combine(outputPath, outputFileName);// 根据格式保存图片if (format.ToUpper() == "JPEG"){SaveJpegWithQuality(image, outputFilePath, quality);}else{// PNG 保存image.Save(outputFilePath, ImageFormat.Png);}}}}}
Render方法参数详解:
public Image Render(int page, int width, int height,float dpiX, float dpiY, PdfRenderFlags flags)
参数 | 说明 | 示例 |
page | 页码(从0开始) | 0表示第1页 |
width,height | 输出图片的宽高(像素) | 1920, 1080 |
dpix,dpiY | X和Y方向DPI | 150, 150 |
flags | 渲染标志 | Annotations = 保留注释 |
PdfiumViewer 的核心价值:上面这短短几行代码,如果没有这个库,你需要自己处理PDF解析、字体渲染、页面布局等一系列复杂问题。PdfiumViewer 把这些复杂度全部封装好了,让PDF处理变得像操作普通图片一样简单。
JPEG质量保存(关键细节) ///<summary>/// 使用指定质量保存 JPEG 图片///</summary>privatevoidSaveJpegWithQuality(Image image, string filePath, long quality){// 获取 JPEG 编码器ImageCodecInfo jpegEncoder = GetEncoder(ImageFormat.Jpeg);// 创建 Encoder 参数对象EncoderParameters encoderParameters = new EncoderParameters(1);// 设置质量参数 (0-100)EncoderParameter encoderParameter = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);encoderParameters.Param[0] = encoderParameter;// 保存image.Save(filePath, jpegEncoder, encoderParameters);// 释放资源encoderParameters.Dispose();}///<summary>/// 获取指定格式的图像编码器///</summary>private ImageCodecInfo GetEncoder(ImageFormat format){ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();foreach (ImageCodecInfo codec in codecs){if (codec.FormatID == format.Guid){return codec;}}throw new InvalidOperationException("未找到指定的图像编码器。");}JPEG质量范围1~100:90是推荐值;75能显著减小体积;100几乎无损但文件很大。
四、参数推荐参考
给一些参考值,这些都是在调试过程中经过测试的,当然实际情况要根据个人的项目进行调试之后才可以。
使用场景 | 宽度 | 高度 | DPI | 格式 | 质量 |
网页预览 | 800 | 自动 | 96 | JPEG | 75 |
文档归档 | 1200 | 自动 | 150 | PNG | — |
打印输出 | 2000 | 自动 | 300 | JPEG | 95 |
文字识别OCR | 1500 | 自动 | 200 | PNG | — |
高度填0时PdfiumViewer会自动按比例计算,代码中如需支持可额外处理。
最后
拥有了一款完全属于自己的PDF转图片工具。没有广告、不收费、不限页数,想怎么用就怎么用。
PdfiumViewer 的出现,大大降低了PDF处理的门槛——原本需要理解复杂PDF规范的工作,现在只需要调用几行简单的API就能完成。这也是开源社区的魅力所在。此外他的功能远不止此,比如:显示PDF,打印PDF,提取文本,获取书签等功能,如果感兴趣甚至可以做一个PDF阅读器。
本文配套源码可以分享,如有需要的小伙伴可私信+留言获取 如果觉得有用,欢迎点赞、分享、推荐,感谢支持!
夜雨聆风