我已经成功打印了Windows窗体,但是所有文本都有些模糊。我已经得出结论,这是由于屏幕分辨率远小于打印机使用的分辨率的结果。我的方法是否存在根本缺陷,或者是否有办法在打印之前重新格式化文本,使文本清晰可见?
void PrintImage(object o, PrintPageEventArgs e)
{
int x = SystemInformation.WorkingArea.X;
int y = SystemInformation.WorkingArea.Y;
int width = panel1.Width;
int height = panel1.Height;
Rectangle bounds = new Rectangle(x, y, width, height);
Bitmap img = new Bitmap(width, height);
this.DrawToBitmap(img, bounds);
Point p = new Point(100, 100);
e.Graphics.DrawImage(img, p);
}
private void BtnPrint_Click(object sender, EventArgs e)
{
btnPrint.Visible = false;
btnCancel.Visible = false;
if(txtNotes.Text == "Notes:" || txtNotes.Text == "")
{
txtNotes.Visible = false;
}
PrintDocument pd = new PrintDocument();
pd.PrintPage += new PrintPageEventHandler(PrintImage);
pd.Print();
}
答案 0 :(得分:1)
我的方法[...]是否存在根本缺陷?
是的。
您使用panel1
的大小来计算图像的大小。稍后,您让this
绘制到图像上,但是this
是表单,而不是面板。
是什么让您认为SystemInformation.WorkingArea
与要打印的窗口有关?
您应该多注意一次性物品。
[...]是否可以在打印之前重新格式化文本,使文本清晰显示?
没有一种通用的方法可以使您缩放所有其他控件。
但是,您可以使用NearestNeighbor
机制将位图按一定比例放大,从而获得清晰的像素化文本,而不是模糊的文本。
以下是在Acrobat Reader中以相同的缩放级别(未放大)生成的PDF(未缩放)(左)和3缩放因子(右)的差异:
这是缩放代码,也没有解决任何一次性问题:
this.DrawToBitmap(img, bounds);
Point p = new Point(100, 100);
img = ResizeBitmap(img, 3);
e.Graphics.DrawImage(img, p);
}
private static Bitmap ResizeBitmap(Bitmap source, int factor)
{
Bitmap result = new Bitmap(source.Width*factor, source.Height*factor);
result.SetResolution(source.HorizontalResolution*factor, source.VerticalResolution*factor);
using (Graphics g = Graphics.FromImage(result))
{
g.InterpolationMode = InterpolationMode.NearestNeighbor;
g.DrawImage(source, 0, 0, source.Width*factor, source.Height*factor);
}
return result;
}