【问题标题】:Print on client default printer instead of server在客户端默认打印机而不是服务器上打印
【发布时间】:2015-09-08 11:01:59
【问题描述】:

我将我的应用程序托管在远程网络服务器上,当我单击客户端计算机上的“打印”按钮时,我收到“未安装打印机”错误,我从中了解到应用程序正在尝试在服务器上查找打印机而不是客户端计算机。

我正在使用此代码进行打印:

 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 flow 上看到过类似的问题,它们使用“打印对话框”打开对话框供用户从他的计算机中进行选择。我有两个问题:
1- PrintDialog 仅在 Windows 窗体应用程序中可用
2- 我想保留一键打印二维码的选项,而不是增加用户必须执行的点击次数。

【问题讨论】:

  • 您应该使用 javascript 或 jquery 来实现这一点。在服务器上编写代码并不能解决您的目的。

标签: asp.net web-applications printing


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。我正在使用 Internet Explorer,函数“window.print()”导致 Internet Explorer 挂起并关闭所有窗口。知道如何解决吗?
  • 您看到图像渲染正确了吗? ,如果是这样,请删除 Window.print 命令,然后只需单击文件-> 打印。如果这有效,则 window.print 应该在每个浏览器中都可以正常工作。我相信问题出在它自己的html中
  • 是的,它的渲染正确。我刚刚尝试在 IE 的兼容模式下运行它,它似乎工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多