C# 将 A4 尺寸面板打印到打印机
C# Printing A4 size panel to a printer
我正在尝试将面板打印到 A4 尺寸的纸张上。该面板将包含报告、发票等,因此它应该完全按照设计器中的外观打印。
面板的属性是,
面板内容,
这是我正在使用的代码。
private void PrintPanel()
{
System.Drawing.Printing.PrintDocument doc = new PrintDocument();
doc.PrintPage += new PrintPageEventHandler(doc_PrintPage);
doc.Print();
}
private void doc_PrintPage(object sender, PrintPageEventArgs e)
{
Bitmap bmp = new Bitmap(panel1.Width, panel1.Height);
float tgtWidthMM = 210; //A4 paper size
float tgtHeightMM = 297;
float tgtWidthInches = tgtWidthMM / 25.4f;
float tgtHeightInches = tgtHeightMM / 25.4f;
float srcWidthPx = bmp.Width;
float srcHeightPx = bmp.Height;
float dpiX = srcWidthPx / tgtWidthInches;
float dpiY = srcHeightPx / tgtHeightInches;
bmp.SetResolution(dpiX, dpiY);
panel1.DrawToBitmap(bmp, panel1.ClientRectangle);
e.Graphics.PageUnit = GraphicsUnit.Millimeter;
e.Graphics.DrawImage(bmp, 0, 0, tgtWidthMM, tgtHeightMM);
}
private void button1_Click(object sender, EventArgs e)
{
int pixelsWidth = 787;
int pixelsHeight = 1114; //1 cm ~ 37.5
panel1.Size = new Size(pixelsWidth, pixelsHeight);
PrintPanel();
}
这很好用,可以将内容打印成 pdf(我的默认打印机设置为 Microsoft pdf 打印机)。问题是内容没有填满A4sheet,就在旁边,如下图:
编辑:
一发题就发现了我的错误。单击按钮时,我正在设置面板的高度和宽度。这些值大于设计器中设置的值,并且标签未锚定。只需注释掉行 panel1.Size = new Size(pixelsWidth, pixelsHeight);
。事情变得更好了。
虽然标签看起来有点像素化,有没有办法让它更清晰?
你在尺寸调整方面做了很多事情,看起来你的比例是罪魁祸首。
- 面板有
width=420
、height=594
- A4 应采用相同的纵横比(例如:
width=840
,
height=1188
)
对于您的分辨率问题,为简单起见,我建议您以单个单位(像素)工作,并使用整数(因为位图不能很好地处理小数——即没有半个像素这样的东西)
我的建议是,如果您要使用位图在 A4 纸上打印,请尝试获取 A4 纸 width/height 的整数度量值(以像素为单位),然后从那里返回。
我正在尝试将面板打印到 A4 尺寸的纸张上。该面板将包含报告、发票等,因此它应该完全按照设计器中的外观打印。
面板的属性是,
面板内容,
这是我正在使用的代码。
private void PrintPanel()
{
System.Drawing.Printing.PrintDocument doc = new PrintDocument();
doc.PrintPage += new PrintPageEventHandler(doc_PrintPage);
doc.Print();
}
private void doc_PrintPage(object sender, PrintPageEventArgs e)
{
Bitmap bmp = new Bitmap(panel1.Width, panel1.Height);
float tgtWidthMM = 210; //A4 paper size
float tgtHeightMM = 297;
float tgtWidthInches = tgtWidthMM / 25.4f;
float tgtHeightInches = tgtHeightMM / 25.4f;
float srcWidthPx = bmp.Width;
float srcHeightPx = bmp.Height;
float dpiX = srcWidthPx / tgtWidthInches;
float dpiY = srcHeightPx / tgtHeightInches;
bmp.SetResolution(dpiX, dpiY);
panel1.DrawToBitmap(bmp, panel1.ClientRectangle);
e.Graphics.PageUnit = GraphicsUnit.Millimeter;
e.Graphics.DrawImage(bmp, 0, 0, tgtWidthMM, tgtHeightMM);
}
private void button1_Click(object sender, EventArgs e)
{
int pixelsWidth = 787;
int pixelsHeight = 1114; //1 cm ~ 37.5
panel1.Size = new Size(pixelsWidth, pixelsHeight);
PrintPanel();
}
这很好用,可以将内容打印成 pdf(我的默认打印机设置为 Microsoft pdf 打印机)。问题是内容没有填满A4sheet,就在旁边,如下图:
编辑:
一发题就发现了我的错误。单击按钮时,我正在设置面板的高度和宽度。这些值大于设计器中设置的值,并且标签未锚定。只需注释掉行 panel1.Size = new Size(pixelsWidth, pixelsHeight);
。事情变得更好了。
虽然标签看起来有点像素化,有没有办法让它更清晰?
你在尺寸调整方面做了很多事情,看起来你的比例是罪魁祸首。
- 面板有
width=420
、height=594
- A4 应采用相同的纵横比(例如:
width=840
,height=1188
)
对于您的分辨率问题,为简单起见,我建议您以单个单位(像素)工作,并使用整数(因为位图不能很好地处理小数——即没有半个像素这样的东西)
我的建议是,如果您要使用位图在 A4 纸上打印,请尝试获取 A4 纸 width/height 的整数度量值(以像素为单位),然后从那里返回。