在客户端默认打印机而不是服务器上打印

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;
      }
   }