在C#中打印Form / UserControl

我的程序:包含一个包含少量文本框和一个按钮的表单。 “默认打印机”在我的计算机上设置为Adobe PDF

我的目标:当用户点击“打印”按钮时,想要截取表单/ usercontrol的屏幕截图。 然后屏幕截图以.pdf格式保存在桌面上。

我的问题:我在代码中遇到两个问题:

  1. 屏幕截图的大小:屏幕截图的大小太大,打印/转换为.pdf时,它不适合页面大小(默认页面大小)。 请参考下面的两张图片。 我希望整个屏幕截图适合页面。
  2. 询问两次转换和保存的位置:当我点击“打印表单”按钮时,程序会询问我TWICE在哪里打印/转换并保存文件。 我希望程序只询问一次,在哪里打印并保存文件。

问题1:程序捕获的屏幕截图在打印时不适合页面。 问题1:程序捕获的屏幕截图在打印时不适合页面。

我希望截图图像在.pdf的一页上适合这样: 在此处输入图像描述

码:

public partial class Form1 : Form { public Form1() { InitializeComponent(); button1.Text = "Print Form"; button1.Click += new EventHandler(button1_Click); printDocument1.PrintPage += new PrintPageEventHandler(printDocument1_PrintPage); this.Controls.Add(button1); } private void button1_Click(object sender, EventArgs e) { CaptureScreen(); printDocument1.Print(); } Bitmap memoryImage; private void CaptureScreen() { Graphics myGraphics = this.CreateGraphics(); Size s = this.Size; memoryImage = new Bitmap(s.Width, s.Height, myGraphics); Graphics memoryGraphics = Graphics.FromImage(memoryImage); memoryGraphics.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, s); } private void printDocument1_PrintPage(System.Object sender, System.Drawing.Printing.PrintPageEventArgs e) { e.Graphics.DrawImage(memoryImage, 0, 0); } } 

感谢您的帮助。 我是新手,学习c#语言,非常感谢你的帮助。 🙂

好的,请检查一下,特别是修改后的printDocument1_PrintPage

  private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { // calculate width and height scalings taking page margins into account var wScale = e.MarginBounds.Width / (float)_memoryImage.Width; var hScale = e.MarginBounds.Height / (float)_memoryImage.Height; // choose the smaller of the two scales var scale = wScale < hScale ? wScale : hScale; // apply scaling to the image e.Graphics.ScaleTransform(scale, scale); // print to default printer's page e.Graphics.DrawImage(_memoryImage, 0, 0); } 

我将所有事件连线移动到InitializeComponent中,它通常应该去,但它涉及的代码更多:

 using System; using System.Drawing; using System.Drawing.Printing; using System.Windows.Forms; namespace testScreenCapScale { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { CaptureScreen(); printDocument1.Print(); } private Bitmap _memoryImage; private void CaptureScreen() { // put into using construct because Graphics objects do not // get automatically disposed when leaving method scope using (var myGraphics = CreateGraphics()) { var s = Size; _memoryImage = new Bitmap(s.Width, s.Height, myGraphics); using (var memoryGraphics = Graphics.FromImage(_memoryImage)) { memoryGraphics.CopyFromScreen(Location.X, Location.Y, 0, 0, s); } } } private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { // calculate width and height scalings taking page margins into account var wScale = e.MarginBounds.Width / (float)_memoryImage.Width; var hScale = e.MarginBounds.Height / (float)_memoryImage.Height; // choose the smaller of the two scales var scale = wScale < hScale ? wScale : hScale; // apply scaling to the image e.Graphics.ScaleTransform(scale, scale); // print to default printer's page e.Graphics.DrawImage(_memoryImage, 0, 0); } } } 

Form1.Designer.cs

 namespace testScreenCapScale { partial class Form1 { private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) { if (disposing && (components != null)) components.Dispose(); base.Dispose(disposing); } private void InitializeComponent() { this.printDocument1 = new System.Drawing.Printing.PrintDocument(); this.button1 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // printDocument1 // this.printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printDocument1_PrintPage); // // button1 // this.button1.Location = new System.Drawing.Point(64, 220); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 0; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(384, 377); this.Controls.Add(this.button1); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); } private System.Drawing.Printing.PrintDocument printDocument1; private System.Windows.Forms.Button button1; } }