.Net的PDF转图片
用的是破解版的 O2S.Components.PDFRender4NET.dll 插件, 简单引用即可

public static class PdfToImage { public static MemoryStream GetPdfImagePageStream(string pdfInputPath, int pageIndex, ImageFormat format, int width = 1600, int height = 2560, int quality = 10) { try { //pdf处理插件 PDFFile pdfFile = PDFFile.Open(pdfInputPath); int total = pdfFile.PageCount; #region 防止异常参数 if (pageIndex < 0) { pageIndex = 0; } if (pageIndex > total) { pageIndex = total - 1; } if (quality < 1) { quality = 1; } if (quality > 10) { quality = 10; } if (width <= 0) { width = 1; } if (height <= 0) { height = 1; } #endregion //pdf转换图片 SizeF pageSize = pdfFile.GetPageSize(pageIndex); Bitmap pageImage = pdfFile.GetPageImage(pageIndex, 56 * quality); MemoryStream ms = new MemoryStream(); pageImage.Save(ms, format); //原图 Image img = Image.FromStream(ms, true); double ratio = (double)width / (double)height; double oRatio = (double)img.Width / (double)img.Height; int sbWidth = 0; int sbHeight = 0; int outX = 0; int outY = 0; if (oRatio < ratio) { sbWidth = (int)(img.Width * ((double)height / (double)(img.Height))); sbHeight = height; outX = (width - sbWidth) / 2; } else { sbHeight = (int)(img.Height * ((double)width / (double)(img.Width))); sbWidth = width; outY = (height - sbHeight) / 2; } //缩放 Image sbImg = new Bitmap(sbWidth, sbHeight); Graphics sbGra = Graphics.FromImage(sbImg); sbGra.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; sbGra.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; sbGra.Clear(Color.White); sbGra.DrawImage(img, new System.Drawing.Rectangle(0, 0, sbWidth, sbHeight), new System.Drawing.Rectangle(0, 0, img.Width, img.Height), System.Drawing.GraphicsUnit.Pixel); //补白 Image outImg = new System.Drawing.Bitmap(width, height); Graphics outGra = System.Drawing.Graphics.FromImage(outImg); outGra.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; outGra.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; outGra.Clear(Color.White); outGra.DrawImage(sbImg, new System.Drawing.Rectangle(outX, outY, sbWidth, sbHeight), new System.Drawing.Rectangle(0, 0, sbWidth, sbHeight), System.Drawing.GraphicsUnit.Pixel); MemoryStream outMs = new MemoryStream(); outImg.Save(outMs, format); sbImg.Dispose(); outImg.Dispose(); img.Dispose(); return outMs; } catch (Exception ex) { } return new MemoryStream(); } public static MemoryStream GetPdfImagePageStream(Stream stream, int pageIndex, ImageFormat format, int width = 1600, int height = 2560, int quality = 10) { try { //pdf处理插件 PDFFile pdfFile = PDFFile.Open(stream); int total = pdfFile.PageCount; #region 防止异常参数 if (pageIndex < 0) { pageIndex = 0; } if (pageIndex > total) { pageIndex = total - 1; } if (quality < 1) { quality = 1; } if (quality > 10) { quality = 10; } if (width <= 0) { width = 1; } if (height <= 0) { height = 1; } #endregion //pdf转换图片 SizeF pageSize = pdfFile.GetPageSize(pageIndex); Bitmap pageImage = pdfFile.GetPageImage(pageIndex, 56 * quality); MemoryStream ms = new MemoryStream(); pageImage.Save(ms, format); //原图 Image img = Image.FromStream(ms, true); double ratio = (double)width / (double)height; double oRatio = (double)img.Width / (double)img.Height; int sbWidth = 0; int sbHeight = 0; int outX = 0; int outY = 0; if (oRatio < ratio) { sbWidth = (int)(img.Width * ((double)height / (double)(img.Height))); sbHeight = height; outX = (width - sbWidth) / 2; } else { sbHeight = (int)(img.Height * ((double)width / (double)(img.Width))); sbWidth = width; outY = (height - sbHeight) / 2; } //缩放 Image sbImg = new Bitmap(sbWidth, sbHeight); Graphics sbGra = Graphics.FromImage(sbImg); sbGra.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; sbGra.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; sbGra.Clear(Color.White); sbGra.DrawImage(img, new System.Drawing.Rectangle(0, 0, sbWidth, sbHeight), new System.Drawing.Rectangle(0, 0, img.Width, img.Height), System.Drawing.GraphicsUnit.Pixel); //补白 Image outImg = new System.Drawing.Bitmap(width, height); Graphics outGra = System.Drawing.Graphics.FromImage(outImg); outGra.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; outGra.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; outGra.Clear(Color.White); outGra.DrawImage(sbImg, new System.Drawing.Rectangle(outX, outY, sbWidth, sbHeight), new System.Drawing.Rectangle(0, 0, sbWidth, sbHeight), System.Drawing.GraphicsUnit.Pixel); MemoryStream outMs = new MemoryStream(); outImg.Save(outMs, format); sbImg.Dispose(); outImg.Dispose(); img.Dispose(); return outMs; } catch (Exception ex) { } return new MemoryStream(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构