【问题标题】:Print labels via a redirected printer通过重定向打印机打印标签
【发布时间】:2015-06-06 00:48:14
【问题描述】:

我的任务是通过热敏打印机打印标签。为此,会生成一串 tspl(打印机能够理解的编程语言)命令并将其发送到打印机。后者是在 C# 中完成的,下面的方法取自 microsoft 示例 "How to send raw data to a printer by using Visual C# .NET"

        public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
    {
        Int32 dwError = 0, dwWritten = 0;
        IntPtr hPrinter = new IntPtr(0);
        DOCINFOA di = new DOCINFOA();
        bool bSuccess = false; // Assume failure unless you specifically succeed.

        di.pDocName = "My C#.NET RAW Document";
        di.pDataType = "RAW";

        // Open the printer.
        if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
        {
            // Start a document.
            if (StartDocPrinter(hPrinter, 1, di))
            {
                // Start a page.
                if (StartPagePrinter(hPrinter))
                {
                    // Write your bytes.
                    bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                    EndPagePrinter(hPrinter);
                }
                EndDocPrinter(hPrinter);
            }
            ClosePrinter(hPrinter);
        }
        // If you did not succeed, GetLastError may give more information
        // about why not.
        if (bSuccess == false)
        {
            dwError = Marshal.GetLastWin32Error();
            MessageBox.Show("Error " + dwError);
        }
        return bSuccess;
    }

在 PrintDialog 中选择了实际的打印机

        private void button2_Click(object sender, EventArgs e)
    {
        string s = "CLS\nPRINT 1\n"; // device-dependent string, need a FormFeed?
        // Allow the user to select a printer.
        PrintDialog pd = new PrintDialog();
        pd.PrinterSettings = new PrinterSettings();
        if (DialogResult.OK == pd.ShowDialog(this))
        {
            // Send a printer-specific to the printer.
            RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, s);
        }
    }

在我的工作环境中一切正常。环境是由 3 台计算机和 1 台共享热敏打印机组成的 LAN:

  1. PC_with_printer - 它在 Windows 7 上运行并通过 USB 连接打印机
  2. PC_aware - 它在 Win 8 上运行并且知道共享打印机
  3. PC_unaware - 它在 WinXP 上运行并且没有安装共享打印机

从 PC_aware 我通过 rdp 连接到 PC_unaware,打印机在重定向的打印机列表中显示。然后我运行我的应用程序,选择重定向的打印机并打印我的空标签。到目前为止一切顺利。
当我用另一台计算机替换 PC_unaware 时,问题就开始了。它在 Windows Server 2008 R2 上运行,不在我们的局域网中。我们称它为服务器。于是我进行了同样的实验:

  1. 从 PC_aware 我通过 rdp 使用其公共 IP 地址连接到 SERVER
  2. 我的热敏打印机在“打印机和设备”中显示为“TSC_TDP-244(重定向 20)”
  3. 我转到打印机的属性并单击打印测试页,它被打印出来了
  4. 我运行我的应用程序,但打印机没有打印任何内容。

我检查了 SendBytesToPrinter 方法中使用的所有 winapi 函数的返回值(OpenPrinter、StartDocPrinter、StartPagePrinter、WritePrinter、EndPagePrinter、EndDocPrinter、ClosePrinter),它们都没有指示错误。知道为什么会发生这种情况以及如何解决吗?

【问题讨论】:

  • 这实际上更像是一个远程桌面问题。由于 PC_unaware 没有 LAN 连接,也没有安装共享打印机,所以它依赖于 RD 的打印机克隆功能,我一直认为这是有问题的。 RD 对于您要解决的问题真的很重要吗?如果没有,我会把它从图片中删除。
  • 这个打印功能应该在服务器上可用,用户通过rdp连接到它,所以恐怕RD是必不可少的部分。
  • 我不知道 RD 是如何实现打印机克隆的,但我强烈怀疑这取决于所涉及的假脱机程序,这意味着直接写入克隆的打印机是行不通的。 RD 中需要大量复杂的代码来支持直接打印,而且我猜测他们没有实现它的情况很少见。

标签: winapi printing windows-server-2008-r2 rdp thermal-printer


【解决方案1】:
PRINTER_DEFAULTS pd;

    pd.DesiredAccess = PRINTER_ACCESS_USE;
    pd.pDatatype = NULL;
    pd.pDevMode = NULL;

    if (!OpenPrinter(szPrinterName, &hPrinter, &pd))
        return false;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-26
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多