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

