You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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转图片:

  1. 安装NuGet包:
    dotnet add package SkiaSharp
    dotnet add package SkiaSharp.NativeAssets.macOS
    dotnet add package PDFiumSharp
    dotnet add package PDFiumSharp.NativeAssets.macOS
    
  2. 示例代码:
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处理图片保存:

  1. 安装NuGet包:
    dotnet add package UglyToad.PdfPig
    dotnet add package SixLabors.ImageSharp
    dotnet add package SixLabors.ImageSharp.Formats.Png
    
  2. 示例代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:42:10