macOS下.NET 8.0 C#无法转PDF为图片:多库尝试均报错求助
在macOS .NET 8下实现PDF转图片(缩略图)的解决方案
错误原因分析
错误1:System.FormatException(Base64无效)
你调用的Conversion.SavePng(pdfPath, outputImagePath)方法签名有误——这个重载的第一个参数要求的是PDF文件的Base64字符串,而非本地文件路径。直接传路径会被当成Base64解析,自然触发格式错误。
错误2:无法解析ImageSharp的Save方法
大概率是命名空间未引用或版本不兼容:
- 未引用
SixLabors.ImageSharp.Formats.Png命名空间 - .NET 8对应的ImageSharp版本中,
Save方法的参数结构或重载已变更,比如需要使用SaveAsPng扩展方法
错误3:System.Drawing跨平台警告
System.Drawing.Imaging.ImageFormat是Windows平台专属API,.NET跨平台环境下调用会触发CA1416警告,且运行时可能出现兼容性问题,必须替换为跨平台图形库(如ImageSharp、SkiaSharp)。
可行解决方案
方案1:修正PDFtoImage的调用方式
如果坚持用PDFtoImage库,需要先将PDF文件读取为字节数组再转成Base64字符串,再传入方法:
using System; using System.IO; using PDFtoImage; namespace PdfToImageApp { class Program { static void Main(string[] args) { string pdfPath = "Downloads/testconvert2.pdf"; string outputImagePath = "Downloads/output.png"; // 读取PDF文件并转为Base64 byte[] pdfBytes = File.ReadAllBytes(pdfPath); string pdfBase64 = Convert.ToBase64String(pdfBytes); // 调用正确的重载(先传输出路径,再传Base64) Conversion.SavePng(outputImagePath, pdfBase64); Console.WriteLine("转换完成!"); } } }
方案2:使用SkiaSharp + PDFium(推荐跨平台)
SkiaSharp是谷歌的跨平台图形库,结合PDFium可以稳定实现PDF转图片:
- 安装NuGet包:
dotnet add package SkiaSharp dotnet add package SkiaSharp.NativeAssets.macOS dotnet add package PDFiumSharp dotnet add package PDFiumSharp.NativeAssets.macOS - 示例代码:
using System.IO; using PDFiumSharp; using SkiaSharp; namespace PdfThumbnailGenerator { class Program { static void Main(string[] args) { string pdfPath = "Downloads/testconvert2.pdf"; string outputImagePath = "Downloads/output.png"; int thumbnailWidth = 300; // 缩略图宽度 using var document = new PdfDocument(pdfPath); using var page = document.Pages[0]; // 获取第一页 // 计算缩略图高度(保持原比例) float scale = (float)thumbnailWidth / page.Size.Width; int thumbnailHeight = (int)(page.Size.Height * scale); // 渲染页面到SkiaSharp位图 using var bitmap = new SKBitmap(thumbnailWidth, thumbnailHeight); using var canvas = new SKCanvas(bitmap); canvas.Clear(SKColors.White); using var pdfBitmap = page.Render((int)(page.Size.Width * scale), (int)(page.Size.Height * scale)); using var skImage = SKImage.FromPixelCopy(pdfBitmap.SkiaPixmap); canvas.DrawImage(skImage, 0, 0); // 保存为PNG using var stream = File.OpenWrite(outputImagePath); bitmap.Encode(stream, SKEncodedImageFormat.Png, 90); Console.WriteLine("缩略图生成完成!"); } } }
方案3:使用UglyToad.PdfPig + ImageSharp
UglyToad.PdfPig负责解析PDF,ImageSharp处理图片保存:
- 安装NuGet包:
dotnet add package UglyToad.PdfPig dotnet add package SixLabors.ImageSharp dotnet add package SixLabors.ImageSharp.Formats.Png - 示例代码:
using System.IO; using UglyToad.PdfPig; using UglyToad.PdfPig.Content; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Formats.Png; namespace PdfToImage { class Program { static void Main(string[] args) { string pdfPath = "Downloads/testconvert2.pdf"; string outputImagePath = "Downloads/output.png"; int dpi = 96; // 渲染DPI,控制清晰度 using var document = PdfDocument.Open(pdfPath); Page page = document.GetPage(1); // 第一页(索引从1开始) // 获取页面尺寸 var size = page.Size; int width = (int)(size.Width * dpi / 72); int height = (int)(size.Height * dpi / 72); // 创建ImageSharp位图并渲染页面内容 using var image = new Image<Rgba32>(width, height); using var graphics = SixLabors.ImageSharp.Drawing.Graphics.FromImage(image); foreach (var letter in page.Letters) { // 渲染文本(如需完整渲染,还需处理图片等元素,推荐结合SkiaSharp更高效) var fontSize = (int)(letter.FontSize * dpi / 72); var font = SixLabors.Fonts.SystemFonts.CreateFont(letter.FontName, fontSize); graphics.DrawText(letter.Value, font, Rgba32.Black, new SixLabors.ImageSharp.PointF((float)(letter.BoundingBox.Left * dpi /72), (float)(size.Height - letter.BoundingBox.Top) * dpi /72)); } // 保存为PNG(注意引用SixLabors.ImageSharp.Formats.Png命名空间) image.Save(outputImagePath, new PngEncoder()); } } }
内容的提问来源于stack exchange,提问作者Heisenberg
相关产品推荐
相关产品推荐

