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

C#使用System.Drawing.Printing保存PDF时图片裁剪问题求助

问题描述

我开发了一个C#应用,支持页面编辑、文档打印及PDF导出功能。当前遇到以下异常:

  • 点击「Print Preview」按钮时,打印预览中的图片显示完全正常
  • 但通过PrintDocument控件直接打印,或使用预览界面的保存选项导出PDF后,图片出现裁剪问题

已尝试的排查动作:

  • 调整图片尺寸(缩小/放大)
  • 更换不同格式、不同分辨率的图片
    问题仍未解决。

附相关素材:

  • 应用控件布局截图
  • 核心代码示例
  • 测试用示例图片
  • 打印预览正常显示截图
  • 导出PDF后图片裁剪的截图
排查方向与解决方法

1. 校准打印区域的尺寸映射逻辑

PrintDocument的打印区域(PrintPageEventArgs.MarginBounds/PrintPageEventArgs.PageBounds)和预览控件的渲染区域可能存在差异,导出PDF时常因未正确适配页面尺寸导致裁剪。

解决代码示例:

private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
    // 获取打印可用区域
    var printArea = e.MarginBounds;
    // 计算等比例缩放系数,确保图片不超出打印区域
    float scale = Math.Min((float)printArea.Width / image.Width, (float)printArea.Height / image.Height);
    int scaledWidth = (int)(image.Width * scale);
    int scaledHeight = (int)(image.Height * scale);
    // 居中绘制图片
    int x = printArea.Left + (printArea.Width - scaledWidth) / 2;
    int y = printArea.Top + (printArea.Height - scaledHeight) / 2;
    e.Graphics.DrawImage(image, x, y, scaledWidth, scaledHeight);
}

2. 统一DPI适配规则

打印预览控件会自动适配屏幕DPI,但PrintDocument导出PDF时默认使用打印机DPI(通常为600),二者DPI不一致会导致图片缩放计算错误。

解决代码示例:

private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
    // 强制Graphics对象匹配打印机DPI
    e.Graphics.PageUnit = GraphicsUnit.Document;
    e.Graphics.DpiX = printDocument1.DefaultPageSettings.PrinterResolution.X;
    e.Graphics.DpiY = printDocument1.DefaultPageSettings.PrinterResolution.Y;
    // 后续绘制逻辑保持与上述示例一致
}

3. 锁定PDF导出的页面设置

预览控件自带的PDF保存功能可能默认使用非预期的页面尺寸(比如预览用A4,导出用Letter),需强制统一页面参数。

解决代码示例:

// 初始化PrintDocument时设置页面参数
printDocument1.DefaultPageSettings.PaperSize = new PaperSize(PaperName.A4, 827, 1169); // A4对应96DPI的像素尺寸
printDocument1.DefaultPageSettings.Margins = new Margins(50, 50, 50, 50); // 统一边距(单位:百分之一英寸)

4. 规避DrawImage重载的自动裁剪陷阱

部分DrawImage重载会自动裁剪图片以适配目标矩形,需使用明确指定宽高的重载:

  • 错误示例:e.Graphics.DrawImage(image, targetRect);(可能触发自动裁剪)
  • 正确示例:e.Graphics.DrawImage(image, targetRect.X, targetRect.Y, targetRect.Width, targetRect.Height);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 17:52:08