【问题标题】:Printing to IP Address with Sockets and byte array printing blank pages on some printers使用套接字和字节数组打印到 IP 地址在某些打印机上打印空白页
【发布时间】:2015-01-13 16:18:30
【问题描述】:

有人有向打印机发送字节数组的经验吗?我将 pdf 文件直接发送到打印机的 IP 地址,它在某些打印机上打印,在其他打印机上打印空白页。这是打印机驱动问题吗?这是打印的代码:

 public class PrintService : IPrintService
  {
    ManualResetEvent connectDone;
    ManualResetEvent sendDone;

    /// <inheritDoc />
    public void PrintData(byte[] data, string printerName)
    {
      connectDone = new ManualResetEvent(false);
      sendDone = new ManualResetEvent(false);
      IPAddress ip = IPAddress.Parse(printerName);
      IPEndPoint remoteEP = new IPEndPoint(ip, 9100);
      Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
      client.NoDelay = true;

      try
      {
        client.BeginConnect(remoteEP, new AsyncCallback(connectCallback), client);
        connectDone.WaitOne();
        client.BeginSend(data, 0, data.Length, 0, new AsyncCallback(sendCallback), client);
        sendDone.WaitOne();
      }
      finally
      {
        // Shutdown the client
        this.shutDown(client);
      }
    }

    private void connectCallback(IAsyncResult ar)
    {
      // Retrieve the socket from the state object.
      Socket client = (Socket)ar.AsyncState;

      // Complete the connection.
      client.EndConnect(ar);

      // Signal that the connection has been made.
      connectDone.Set();
    }
    private void sendCallback(IAsyncResult ar)
    {
      // Retrieve the socket from the state object.
      Socket client = (Socket)ar.AsyncState;

      // Complete sending the data to the remote device.
      int bytesSent = client.EndSend(ar);

      // Signal that all bytes have been sent.
      sendDone.Set();
    }
    private void shutDown(Socket client)
    {
      client.Shutdown(SocketShutdown.Both);
      client.Close();
    }
  }

【问题讨论】:

  • 我们有一个打印预览选项,当用户可以在 Web 浏览器中看到 PDF 并且可以选择所有打印选项时,它可以从那里很好地打印。我的替代方案是什么?
  • 在这种情况下,可能是浏览器进行渲染,而不是打印机。您的替代方法是使用库或外部进程(ghostscript、acrobat 阅读器等)在应用程序中渲染 PDF 文件)。这个话题在 SO 之前已经讨论过很多次了。
  • 我认为您对这台打印机的看法可能是正确的,因为我们在另一台打印机上进行了测试并且它工作正常。打印预览有效但原始数据无效,这似乎很奇怪。我正在使用wkhtmltopdf.exe 将 HTML 转换为 PDF。
  • 我不明白为什么这对你来说很奇怪......正如我所说,打印预览可能是由打印应用程序创建的,你是否使用 chrome 来“测试”这个打印场景? Chrome 能够开箱即用地在屏幕上呈现 PDF 文件。
  • odd 不是正确的选择词哈哈,真的一点都不奇怪,你是绝对正确的。令人沮丧是正确的词。

标签: c# sockets pdf printing


【解决方案1】:

所以在尝试了其他类的感觉之后(PrintDocumentPrintServerProcessInfoadobe/foxit,将文件直接复制到打印机,使用 DLLImport[Kernetl32.dll] 在端口创建文件,使用GCHandlepointers),我把注意力集中在弄乱打印机设置上。对于我拥有的特定打印机,这些是允许我的原始代码工作的步骤:

  1. 关闭打印机
  2. 按住打印机上的复选标记(通常位于明显的位置)和右箭头键(在我的情况下位于复选标记旁边)并等待 .... 填满屏幕并消失
  3. 将基本(而非网络)设置恢复为默认设置(不确定是否必须执行此步骤,因为下一步是何时起作用)
  4. 禁用 PPDS(个人打印机数据流http://en.wikipedia.org/wiki/Personal_Printer_Data_Stream

【讨论】:

    【解决方案2】:

    并非所有打印机都可以渲染 PDF 文件,那些可以渲染的打印机甚至可能不支持 PDF 规范的所有可能版本(例如,特定打印机可能不支持复杂的透明胶片)。

    另一种方法是使用库(例如:Amyuni PDF Creator .Net)和PrintDocument 类从您的应用程序中呈现 PDF 文件,或者使用可以为您执行打印的外部进程(如 ghostscript、acrobat 阅读器)等(免责声明:我目前在 Amyuni Technologies 工作)。

    另一种选择是将您的应用程序限制为 Windows 8.1 和 Server 2012 R2 并使用 new APIs provided in these platforms 实现 PDF 到 BITMAP 的转换,然后使用 PrintDocument 类打印位图,但请注意,这些新 API 旨在可以从 Windows 应用商店应用程序中使用,并且在该环境之外使用它们可能并不直接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2014-10-11
      相关资源
      最近更新 更多