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

如何在.NET6 Web Api中使用PDFiumSharpV2放大PDF后转PNG?

问题

在.NET6 Web Api项目中使用PDFiumSharpV2将多页PDF的第一页转换为PNG,转换功能正常,但生成的PNG文本过小,像是PDF被缩小了。希望在转换为图片前将PDF放大20%,但找不到正确方法。

当前采用PDF转Bitmap再转PNG的流程,代码如下:

// PDF to image
using (var doc = new PdfDocument(docObj.PdfBytes))
{
     var page1 = doc.Pages[0];
     using (var bitmap = new PDFiumBitmap((int)page1.Width, (int)page1.Height, true))
     {
          page1.Render(bitmap);
          using (var memoryStreamBmp = new MemoryStream())
          {
               bitmap.Save(memoryStreamBmp);

               using (var imageBmp = System.Drawing.Image.FromStream(memoryStreamBmp))
               {
                    using (var memoryStreamPng = new MemoryStream())
                    {
                         imageBmp.Save(memoryStreamPng, System.Drawing.Imaging.ImageFormat.Png);
                         System.Drawing.Image pngImage = System.Drawing.Image.FromStream(memoryStreamPng);
                         var pngBytes = memoryStreamPng.ToArray();
                         docObj.ImageBase64 = Convert.ToBase64String(pngBytes);
                         pngImage.Save("download_test_image.png");
                    };
               }
          }
     }
}

尝试过手动增大PDFiumBitmap的宽高参数,但仅添加了空白边框,页面内容并未放大。请问如何在转换为位图前放大PDF?

解决方案

问题出在你只修改了Bitmap的尺寸,但没有在渲染PDF页面时应用缩放逻辑。PDFium的Page.Render方法默认是1:1渲染,所以单纯放大Bitmap只会留白,内容不会缩放。要实现20%的放大,需要在渲染时指定缩放比例,具体有两种方式:

方式一:使用RenderSettings设置缩放比例

通过RenderSettings的ScaleX和ScaleY参数直接指定缩放倍数(1.2即放大20%),同时创建对应缩放尺寸的Bitmap:

// PDF to image with 20% zoom
using (var doc = new PdfDocument(docObj.PdfBytes))
{
    var page1 = doc.Pages[0];
    // 放大20%,缩放比例设为1.2
    var scale = 1.2f;
    // 计算缩放后的Bitmap尺寸
    var bitmapWidth = (int)(page1.Width * scale);
    var bitmapHeight = (int)(page1.Height * scale);
    
    using (var bitmap = new PDFiumBitmap(bitmapWidth, bitmapHeight, true))
    {
        // 创建渲染设置并指定缩放比例
        var renderSettings = new RenderSettings
        {
            ScaleX = scale,
            ScaleY = scale
        };
        // 应用缩放设置渲染页面
        page1.Render(bitmap, renderSettings);
        
        using (var memoryStreamPng = new MemoryStream())
        {
            // PDFiumBitmap直接保存为PNG,无需中间转换System.Drawing.Image
            bitmap.Save(memoryStreamPng, ImageFormat.Png);
            docObj.ImageBase64 = Convert.ToBase64String(memoryStreamPng.ToArray());
            // 保存到本地文件
            using (var fileStream = new FileStream("download_test_image.png", FileMode.Create))
            {
                memoryStreamPng.Seek(0, SeekOrigin.Begin);
                memoryStreamPng.CopyTo(fileStream);
            }
        }
    }
}

方式二:通过DPI调整实现缩放

PDF的页面尺寸单位是点(1点=1/72英寸),默认渲染DPI为96。如果要放大20%,可以将DPI设置为96 * 1.2 = 115.2,再计算对应Bitmap尺寸:

using (var doc = new PdfDocument(docObj.PdfBytes))
{
    var page1 = doc.Pages[0];
    // 目标DPI,放大20%
    var targetDpi = 96 * 1.2f;
    // 计算Bitmap尺寸:(页面宽度 / 72) * DPI
    var bitmapWidth = (int)(page1.Width * targetDpi / 72);
    var bitmapHeight = (int)(page1.Height * targetDpi / 72);
    
    using (var bitmap = new PDFiumBitmap(bitmapWidth, bitmapHeight, true))
    {
        // 按目标DPI渲染页面
        page1.Render(bitmap, dpiX: targetDpi, dpiY: targetDpi);
        
        using (var memoryStreamPng = new MemoryStream())
        {
            bitmap.Save(memoryStreamPng, ImageFormat.Png);
            docObj.ImageBase64 = Convert.ToBase64String(memoryStreamPng.ToArray());
            using (var fileStream = new FileStream("download_test_image.png", FileMode.Create))
            {
                memoryStreamPng.Seek(0, SeekOrigin.Begin);
                memoryStreamPng.CopyTo(fileStream);
            }
        }
    }
}

额外优化

你的原代码中多次转换MemoryStream和System.Drawing.Image是多余的,PDFiumBitmap可以直接保存为PNG格式,无需中间转换,这样能提升性能并避免潜在的图像质量损失。

内容的提问来源于stack exchange,提问作者LNX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:00:59