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

iText 7 C#:解决Windows图表转PDF后模糊问题

问题描述

我已实现将Windows图表添加到iText Table并放入横向PDF的功能,但生成的PDF中图表(尤其是文字部分)模糊,直接保存图表到本地时清晰度正常。

示例图片:模糊的图表示例

转换图表的代码如下:

/// <summary>
/// 将Windows图表转换为iText图片
/// </summary>
/// <param name="chart">Windows图表</param>
/// <returns>转换后的iText图片</returns>
private static Image ConvertChartToiTextImage(Chart chart)
{
    System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(chart.Width, chart.Height);
    bmp.SetResolution(600, 600);
    
    chart.DrawToBitmap(bmp, new System.Drawing.Rectangle(0, 0, chart.Width, chart.Height));
    ImageCodecInfo pngEncoder = GetEncoder(ImageFormat.Png);
    EncoderParameters encoderParameters = new EncoderParameters(1);
    encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
    ImageData data = null;
    
    using (MemoryStream stream = new MemoryStream())
    {
        bmp.Save(stream, pngEncoder, encoderParameters);
        data = ImageDataFactory.Create(stream.ToArray());
        data.SetDpi(600, 600);
        data.SetInterpolation(false);
    }
    Image image = new Image(data);
    return image;
}

private static ImageCodecInfo GetEncoder(ImageFormat format)
{ 
    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 
    foreach (ImageCodecInfo codec in codecs) 
    { 
        if (codec.FormatID == format.Guid) 
        { 
            return codec; 
        } 
    } 
    return null;
}

我试过直接设置图表宽高适配表格,但画质没有改善,其他优化尝试已体现在上述代码中。


解决方案

问题核心在于DrawToBitmap的渲染精度限制,以及iText中图片的缩放逻辑导致的模糊,以下是针对性优化方案:

1. 放大绘制尺寸后再缩适配表格

控件本身尺寸较小时,DrawToBitmap的渲染像素数不足,放大后必然模糊。可以先创建2-4倍于目标尺寸的Bitmap,再缩回到表格所需大小:

private static Image ConvertChartToiTextImage(Chart chart)
{
    // 缩放倍数,建议2-4倍,按需调整
    int scaleFactor = 3;
    int renderWidth = chart.Width * scaleFactor;
    int renderHeight = chart.Height * scaleFactor;
    
    System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(renderWidth, renderHeight);
    bmp.SetResolution(600, 600);
    
    // 用放大后的尺寸绘制图表
    chart.DrawToBitmap(bmp, new System.Drawing.Rectangle(0, 0, renderWidth, renderHeight));
    
    ImageCodecInfo pngEncoder = GetEncoder(ImageFormat.Png);
    EncoderParameters encoderParameters = new EncoderParameters(1);
    encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
    ImageData data = null;
    
    using (MemoryStream stream = new MemoryStream())
    {
        bmp.Save(stream, pngEncoder, encoderParameters);
        data = ImageDataFactory.Create(stream.ToArray());
        data.SetDpi(600, 600);
        data.SetInterpolation(false);
    }
    
    Image image = new Image(data);
    // 缩回到原始图表尺寸,适配表格
    image.ScaleToFit(chart.Width, chart.Height);
    // 显式禁用插值渲染
    image.SetRenderingMode(PdfName.N);
    return image;
}

2. 确保图片与表格单元格尺寸匹配

如果图片实际显示尺寸和单元格宽度不匹配,iText会自动缩放导致模糊。可以直接按单元格宽度缩放图片,保持比例:

// 假设表格单元格宽度为cellWidth(单位:点)
image.ScaleToFit(cellWidth, float.MaxValue);

3. 改用矢量图渲染(最优方案)

位图天生存在缩放模糊问题,如果你的图表支持导出为SVG等矢量格式,直接导入iText能获得无损清晰度。例如用第三方库将图表导出为SVG后转换:

// 示例:需借助OxyPlot等库实现图表转SVG
string svgContent = ExportChartToSvg(chart);
Image svgImage = SvgConverter.ConvertToImage(svgContent, new PdfDocument(new PdfWriter(outputStream)));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:21:25