C#通过Socket发送图像进行打印

时间:2018-05-08 19:25:31

标签: c# sockets

有没有一种方法可以在不使用PrintDocument的情况下打印图像?我的团队坚持直接打印到IP而无需在机器上安装打印机(网络打印机,但不想在每台计算机上安装40多台打印机)。到目前为止我所尝试的内容已经打印出一个空白页面,然后在下一次尝试中打印出一行乱码。这是我最新的(胡言乱语):

public static bool SendLTLReportToIP(IList<Stream> _streams, string ipAddress, int port)
        {
            bool rtn = true;

            using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
            {
                IAsyncResult results = socket.BeginConnect(IPAddress.Parse(ipAddress), port, null, null);
                bool success = results.AsyncWaitHandle.WaitOne(5000, true);

                if (!socket.Connected)
                {
                    rtn = false;
                }
                else
                {
                    foreach (var stream in _streams)
                    {
                        Image image = System.Drawing.Image.FromStream(stream);
                        byte[] imageBytes = ImageToByte(image);
                        int numberOfBytes = imageBytes.Length;
                        byte[] numberOfBytesArray = BitConverter.GetBytes(numberOfBytes);
                        /*StreamReader reader = new StreamReader(stream);
                        string MSG = reader.ReadLine();
                        byte[] sendData = Encoding.ASCII.GetBytes(MSG);*/
                        int result = socket.Send(numberOfBytesArray, numberOfBytesArray.Length, 0);
                        if (result == 0)
                        {
                            rtn = false;
                        }
                    }
                }

                return rtn;
            }

我们最初发送此数据的方式是使用PrintDocument,其打印页面功能如下:

private void PrintPage(object sender, PrintPageEventArgs ev)
        {
            using (Metafile pageImage = new Metafile(_streams[_currentPageIndex]))
            {  
                Rectangle destRect = new Rectangle(0, 0, pageImage.Width, pageImage.Height);
                ev.Graphics.DrawImage(pageImage, destRect);

                _currentPageIndex++;
                ev.HasMorePages = (_currentPageIndex < _streams.Count);
            }
        } 

有什么方法可以基本上将两者结合起来?试图只是窃取PrintPage函数并将其放在我的foreach中,但我需要一个DrawImage函数的对象。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:-1)

答案是肯定的,但没有。

支持的方法是使用PrintDocument。

由于C#可以使用不安全的代码并调用任意函数,因此在C#中可以使用计算机可以执行的任何操作。

但不是。

只需。没有。

不要这样做。安装打印机,使用PrintDocument。