在客户端默认打印机而不是服务器上打印
Print on client default printer instead of server
我在远程网络服务器上托管我的应用程序,当我单击客户端计算机上的 "Print" 按钮时,我收到 "No Printers Installed" 错误,从中我了解到该应用程序正在尝试寻找服务器上的打印机,而不是客户端计算机上的打印机。
我正在使用此代码进行打印:
protected void BtnPrint_Click(object sender, EventArgs e)
{
PrintDocument pd = new PrintDocument();
pd.PrintPage += PrintPage;
pd.Print(); // Prints on remote server
}
private void PrintPage(object o, PrintPageEventArgs e)
{
// QR Code
QRCodeEncoder encoder = new QRCodeEncoder();
encoder.QRCodeScale = 3;
String EmployeeId = this.Request.QueryString.Get("EmployeeId ").ToString();
Bitmap img = encoder.Encode(EmployeeId );
Point loc = new Point(1, 1);
e.Graphics.DrawImage(img, loc);
}
编辑:
我在 Stack Over 流程上看到过类似的问题,这些问题使用 "Print Dialog" 打开对话框供用户从他的计算机中选择。我遇到了两个问题:
1- PrintDialog 仅在 windows 表单应用程序
中可用
2- 我想保留一键打印二维码的选项,而不是增加用户必须执行的点击次数。
用 C# 编写的代码 - 代码隐藏,始终 运行 在服务器端
如果你想在客户端机器上打印文档,你应该将文档呈现为html - 这样它就会显示在浏览器中,然后执行javascript函数print();
javascriopt 代码始终在客户端运行。
您可以使用 Data Uri 以便在打印前在浏览器中显示图像
例如:
protected void BtnPrint_Click(object sender, EventArgs e)
{
QRCodeEncoder encoder = new QRCodeEncoder();
encoder.QRCodeScale = 3;
String EmployeeId = this.Request.QueryString.Get("EmployeeId ").ToString();
Bitmap img = encoder.Encode(EmployeeId );
Response.Write("<img src='data:image/bmp;base64,"+ImageToBase64(img,ImageFormat.Bitmap)+"' width='100' height='100' />"); //render image as html
Response.Write("<script>window.print();</script>"); //print page
}
public string ImageToBase64(Image image,
System.Drawing.Imaging.ImageFormat format)
{
using (MemoryStream ms = new MemoryStream())
{
// Convert Image to byte[]
image.Save(ms, format);
byte[] imageBytes = ms.ToArray();
// Convert byte[] to Base64 String
string base64String = Convert.ToBase64String(imageBytes);
return base64String;
}
}
我在远程网络服务器上托管我的应用程序,当我单击客户端计算机上的 "Print" 按钮时,我收到 "No Printers Installed" 错误,从中我了解到该应用程序正在尝试寻找服务器上的打印机,而不是客户端计算机上的打印机。
我正在使用此代码进行打印:
protected void BtnPrint_Click(object sender, EventArgs e)
{
PrintDocument pd = new PrintDocument();
pd.PrintPage += PrintPage;
pd.Print(); // Prints on remote server
}
private void PrintPage(object o, PrintPageEventArgs e)
{
// QR Code
QRCodeEncoder encoder = new QRCodeEncoder();
encoder.QRCodeScale = 3;
String EmployeeId = this.Request.QueryString.Get("EmployeeId ").ToString();
Bitmap img = encoder.Encode(EmployeeId );
Point loc = new Point(1, 1);
e.Graphics.DrawImage(img, loc);
}
编辑:
我在 Stack Over 流程上看到过类似的问题,这些问题使用 "Print Dialog" 打开对话框供用户从他的计算机中选择。我遇到了两个问题:
1- PrintDialog 仅在 windows 表单应用程序
中可用
2- 我想保留一键打印二维码的选项,而不是增加用户必须执行的点击次数。
用 C# 编写的代码 - 代码隐藏,始终 运行 在服务器端
如果你想在客户端机器上打印文档,你应该将文档呈现为html - 这样它就会显示在浏览器中,然后执行javascript函数print(); javascriopt 代码始终在客户端运行。 您可以使用 Data Uri 以便在打印前在浏览器中显示图像
例如:
protected void BtnPrint_Click(object sender, EventArgs e)
{
QRCodeEncoder encoder = new QRCodeEncoder();
encoder.QRCodeScale = 3;
String EmployeeId = this.Request.QueryString.Get("EmployeeId ").ToString();
Bitmap img = encoder.Encode(EmployeeId );
Response.Write("<img src='data:image/bmp;base64,"+ImageToBase64(img,ImageFormat.Bitmap)+"' width='100' height='100' />"); //render image as html
Response.Write("<script>window.print();</script>"); //print page
}
public string ImageToBase64(Image image,
System.Drawing.Imaging.ImageFormat format)
{
using (MemoryStream ms = new MemoryStream())
{
// Convert Image to byte[]
image.Save(ms, format);
byte[] imageBytes = ms.ToArray();
// Convert byte[] to Base64 String
string base64String = Convert.ToBase64String(imageBytes);
return base64String;
}
}