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
相关产品推荐
相关产品推荐

