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

C# WinForm如何将Panel内容放大铺满A4纸打印?

解决Panel内容铺满A4纸打印的问题

你的问题出在没有对Panel的内容进行缩放,只是按原尺寸居中绘制了。下面是修改后的代码,能让Panel内容按比例铺满A4纸的可打印区域:

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    // 获取Panel的尺寸
    int panelWidth = panel97.Width;
    int panelHeight = panel97.Height;
    
    // 创建Panel内容的位图
    Bitmap memoryImage = new Bitmap(panelWidth, panelHeight);
    panel97.DrawToBitmap(memoryImage, panel97.ClientRectangle);
    
    // 获取打印页的可打印区域(避免内容被打印机的不可打印区域切掉)
    Rectangle printArea = e.MarginBounds;
    
    // 计算缩放比例:取宽和高比例中较小的那个,保证内容完整且不变形
    float scaleX = (float)printArea.Width / panelWidth;
    float scaleY = (float)printArea.Height / panelHeight;
    float scale = Math.Min(scaleX, scaleY);
    
    // 计算缩放后的尺寸
    int scaledWidth = (int)(panelWidth * scale);
    int scaledHeight = (int)(panelHeight * scale);
    
    // 计算居中位置(如果不需要居中,直接设为printArea的左上角即可)
    int posX = printArea.Left + (printArea.Width - scaledWidth) / 2;
    int posY = printArea.Top + (printArea.Height - scaledHeight) / 2;
    
    // 绘制缩放后的图像到打印区域
    e.Graphics.DrawImage(memoryImage, new Rectangle(posX, posY, scaledWidth, scaledHeight));
    
    // 释放位图资源
    memoryImage.Dispose();
}

private void btn_print_Click(object sender, EventArgs e)
{
    printDialog1.Document = printDocument1;
    
    if (printDialog1.ShowDialog() == DialogResult.OK)
    {
        printDocument1.Print();
    }
    
    MessageBox.Show("Printed", "");
}

关键改动说明:

  • 改用e.MarginBounds获取可打印区域:PageBounds是整个A4纸的尺寸,但打印机有不可打印的边距,用MarginBounds能确保内容在打印机支持的范围内显示。
  • 按比例缩放:通过计算宽高的缩放比例,取较小值保证内容不会变形,且能完整铺满打印区域的最大可能空间。
  • 可选居中:如果不需要居中,直接把目标矩形设为printArea即可(但这样可能会因为比例问题导致上下或左右有空白,不过如果你的Panel宽高比和A4一致,就会完全铺满)。
  • 释放位图资源:避免内存泄漏,用完Bitmap后调用Dispose()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:10:31