【问题标题】:Send text file directly to network printer将文本文件直接发送到网络打印机
【发布时间】:2013-09-09 18:45:28
【问题描述】:

我有当前工作的代码,它通过编写一个临时文件将原始数据发送到打印机,然后使用File.Copy() 将其发送到打印机。 File.Copy() 支持本地端口,如 LPT1 和共享打印机,如 \\FRONTCOUNTER\LabelPrinter

但是,现在我试图让它与直接在网络上的打印机一起工作:192.168.2.100,但我不知道要使用的格式。

File.Copy(filename, @"LPT1", true); // Works, on the FRONTCOUNTER computer
File.Copy(filename, @"\\FRONTCOUNTER\LabelPrinter", true); // Works from any computer
File.Copy(filename, @"\\192.168.2.100", true); // New printer, Does not work

我知道可以从每台计算机上“添加打印机”,但我希望避免这种情况 - 上面的第二行代码可以在网络上的任何计算机上自动运行,无需配置。我也知道可以 P/Invoke windows print spooler,如果这是我唯一的选择,我可能会接受它,但这比我想要的要多得多的代码开销。

理想情况下,有人有办法让File.Copy() 工作,或者有类似的接受网络 IP 的 C# 语句。

【问题讨论】:

    标签: c# printing network-printers


    【解决方案1】:

    您可以使用套接字并将数据直接发送到该 IP 地址。应该与File.Copy 几乎相同。我刚刚试了一下,效果很好。

    我刚刚发送了一些文本,但这是我使用的代码

    Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    clientSocket.NoDelay = true;
    
    IPAddress ip = IPAddress.Parse("192.168.192.6");
    IPEndPoint ipep = new IPEndPoint(ip, 9100);
    clientSocket.Connect(ipep);
    
    byte[] fileBytes = File.ReadAllBytes("test.txt");
    
    clientSocket.Send(fileBytes);
    clientSocket.Close();
    

    【讨论】:

    • FWIW;虽然这确实有效;它仅适用于纯文本。以这种方式将图像文件发送到打印机是行不通的。像这样的东西可能更合适:stackoverflow.com/a/19306171/55053
    【解决方案2】:

    试试这个代码:

    public class PrintHelper
    {
        private readonly IPAddress PrinterIPAddress;
    
        private readonly byte[] FileData;
    
        private readonly int PortNumber;
        private ManualResetEvent connectDoneEvent { get; set; }
    
        private ManualResetEvent sendDoneEvent { get; set; }
    
        public PrintHelper(byte[] fileData, string printerIPAddress, int portNumber = 9100)
        {
            FileData = fileData;
            PortNumber = portNumber;
            if (!IPAddress.TryParse(printerIPAddress, out PrinterIPAddress))
                throw new Exception("Wrong IP Address!");
        }
    
        public PrintHelper(byte[] fileData, IPAddress printerIPAddress, int portNumber = 9100) 
        {
            FileData = fileData;
            PortNumber = portNumber;
            PrinterIPAddress = printerIPAddress;
        }
    
        /// <inheritDoc />
        public bool PrintData()
        {
            //this line is Optional for checking before send data
            if (!NetworkHelper.CheckIPAddressAndPortNumber(PrinterIPAddress, PortNumber))
                return false;
            IPEndPoint remoteEP = new IPEndPoint(PrinterIPAddress, PortNumber);
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            client.NoDelay = true;
            connectDoneEvent = new ManualResetEvent(false);
            sendDoneEvent = new ManualResetEvent(false);
    
            try
            {
                client.BeginConnect(remoteEP, new AsyncCallback(connectCallback), client);
                connectDoneEvent.WaitOne();
                client.BeginSend(FileData, 0, FileData.Length, 0, new AsyncCallback(sendCallback), client);
                sendDoneEvent.WaitOne();
                return true;
            }
            catch
            {
                return false;
            }
            finally
            {
                // Shutdown the client
                this.shutDownClient(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.
            connectDoneEvent.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.
            sendDoneEvent.Set();
        }
        private void shutDownClient(Socket client)
        {
            client.Shutdown(SocketShutdown.Both);
            client.Close();
        }
    }
    

    网络助手类:

    public static class NetworkHelper
        {
            public static bool CheckIPAddressAndPortNumber(IPAddress ipAddress, int portNumber)
            {
                return PingIPAddress(ipAddress) && CheckPortNumber(ipAddress, portNumber);
            }
            public static bool PingIPAddress(IPAddress iPAddress)
            {
                var ping = new Ping();
                PingReply pingReply = ping.Send(iPAddress);
    
                if (pingReply.Status == IPStatus.Success)
                {
                    //Server is alive
                    return true;
                }
                else
                    return false;
            }
            public static bool CheckPortNumber(IPAddress iPAddress, int portNumber)
            {
                var retVal = false;
                try
                {
                    using (TcpClient tcpClient = new TcpClient())
                    {
                        tcpClient.Connect(iPAddress, portNumber);
                        retVal = tcpClient.Connected;
                        tcpClient.Close();
                    }
                    return retVal;
                }
                catch (Exception)
                {
                    return retVal;
                }
    
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多