直接发送文本文件到网络打印机

问题描述 投票:0回答:2

我当前正在工作的代码通过编写临时文件将原始数据发送到打印机,然后使用

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/调用 Windows 打印后台处理程序,如果这是我唯一的选择,我可能会接受它,但这比我想要的代码开销要多得多。

理想情况下,有人有办法让

File.Copy()
工作,或者有类似的 C# 语句来接受网络 IP。

c# printing network-printers
2个回答
29
投票

您可以使用套接字并将数据直接发送到该 IP 地址。应该和

File.Copy
差不多。我刚刚尝试了一下,效果很好。

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

using 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);

3
投票

尝试这个代码:

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

        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.