Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 紧凑框架套接字文档打印_C#_Sockets_Compact Framework - Fatal编程技术网

C# 紧凑框架套接字文档打印

C# 紧凑框架套接字文档打印,c#,sockets,compact-framework,C#,Sockets,Compact Framework,我正在尝试从windows ce设备将文档打印到网络激光打印机。 因为我正在尝试打印示例文本,所以没有问题,我可以通过trought sockets来完成,我的问题是我需要打印一些文本和文本下方的小图像,例如: not formatted text ------------------ | IMAGE | ------------------ other not formatted text 我的第一个想法是构建一个Rtf文档并将其发送到打印机trought sokets,但

我正在尝试从windows ce设备将文档打印到网络激光打印机。 因为我正在尝试打印示例文本,所以没有问题,我可以通过trought sockets来完成,我的问题是我需要打印一些文本和文本下方的小图像,例如:

not formatted text
------------------
|    IMAGE       |
------------------
other not formatted text
我的第一个想法是构建一个Rtf文档并将其发送到打印机trought sokets,但它显然是打印文档文本内容,而不是文本格式。。。我尝试了许多其他方法来编码要发送的数据,但没有结果。。。有办法做到这一点,还是我只是在浪费时间?如果没有,是否有一种归档方法,即发送PCL/PostScript数据?(对于新激光打印机上的基本命令,驱动程序通常是“标准的”)。 这是我用于在网络打印机上打印的功能:

public static string print_data_to_IP(string printerIP, int printerPort, byte[] myEncoded_bytes)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //Not supported
            //socket.NoDelay = true;

            IPAddress ip = IPAddress.Parse(printerIP);
            IPEndPoint ipEndPoint = new IPEndPoint(ip, printerPort);
            socket.Connect(ipEndPoint);
            socket.Send(myEncoded_bytes);
            socket.Close();
            return null;
        }
myEncoded_字节由以下内容组成:

MemoryStream ms = new MemoryStream();
            using (FileStream stream = File.Open("\\test.rtf", FileMode.Open))
            {
                byte[] stream_to_byte_array = new byte[stream.Length];
                stream.Read(stream_to_byte_array, 0, (int)stream.Length);
                ms = new MemoryStream(stream_to_byte_array);
                stream.Close();
            }
byte[] data = ms.ToArray();
谢谢你的帮助

军团


注:不允许使用外部库,因此我无法使用printCE或类似的“帮助”。

Sry我试图更好地解释我是如何达到目标的,这是一个在@josef之后生成的示例函数,我在选择位置写入一些文本,并在屏幕中央绘制一个红色框(注释解释pcl命令的工作原理)。 遵循PCL手册,您可以轻松地自定义文本和图形()

现在,对于图像,您有两种方法可以遵循:

1) 使用PCL命令“手动”绘制图像,以查看一些示例(如果是一个简单的示例,就像在我的示例中一样,简单的条形码是最好的方法)

2) 使用PCL宏绘制图像。。。。这就是我所能说的,因为阅读让我头疼,迫使我选择方法1:D

希望这有帮助,
Legion

第一个问题是:打印机支持哪些打印机语言?如果是PCL,则需要将位图图像编码为PCL光栅图形,然后将编码数据发送到打印机。请参阅《HP PCL程序员参考》(示例:)。如果打印机能够打印PostScript,则需要将打印数据编码为PostScript命令。谢谢您的回答,我将检查链接。显然,打印机支持这两种方式,所以我只需要选择“平滑”方式:)发送PCL(或PS)命令trought sockets应该可以正常工作吗?再次感谢。您可以使用打印机语言向打印机发送每个原始命令。如果打印机与HP PJL兼容,则可以使用PJL切换打印机语言()。由于您不想使用库(对开源也有效?),因此必须使用本机打印机语言、Postscript或PCL对位图进行编码。Postscript是一种使用堆栈()的编程语言,而PCL是一种简单的顺序语言。祝你好运如果打印机与PDF兼容,请查看iTextSharpCF。
        private void btn_pcl_printing_Click(object sender, EventArgs e)
        {
            string printer_ip = "192.168.1.6";

            char command_start_character = '\u001B';
            char carriage_return = '\u000D';
            char line_feed = '\u000A';
            string lane_escape_character = string.Concat(carriage_return, line_feed); //"\r\n";
#if PJL
            string printer_process_name = "prova.TXT";
            string raw_end_of_file = command_start_character + "%–12345X" + " @PJL EOF" + lane_escape_character;
            raw_end_of_file += command_start_character + "%–12345X";
            string raw_to_print = command_start_character + "%–12345X";
            raw_to_print += " @PJL JOB NAME = \"" + printer_process_name  + "\"" + lane_escape_character;
            raw_to_print += " @PJL ENTER LANGUAGE = PCL" + lane_escape_character;
#else
            //Reset the printer and start a new PAGE
            string raw_to_print = command_start_character + "E";
#endif
            //Set Printer resolution to 150 DPI
            string raw_pcl_commands = command_start_character + "&u150D" + command_start_character + "*t150R";
            //Write "Hello Wold!!" at the position 150x and 150y (the command is case sensitive).
            raw_pcl_commands += command_start_character + "*p150x150Y" + "Hello World!!!";
            //Another way to to what i've just done before
            //raw_pcl_commands += command_start_character + "*p150X" + command_start_character + "*p150Y" + "Hello World!!!";
            raw_pcl_commands += command_start_character + "*p150X" + command_start_character + "*p150Y" + "Hello World!!!";
            //I choose to use RGB colors (v6), select an rgb color (a0,b0,c0) and save it an a palette (i0) that i select (i0S). My selected color is RED (255,0,0)
            raw_pcl_commands += command_start_character + "*v6w255a0b0c0i0S";
            //Another way to to what i've just done before
            //raw_pcl_commands += command_start_character + "*v6W";
            //raw_pcl_commands += command_start_character + "*v255a0b0C" + command_start_character + "*v0i0S";
            //Draw a rectangle 300*150
            raw_pcl_commands += command_start_character + "*c300a150b5P";


            //COMANDI PCL
            raw_pcl_commands += command_start_character + "E";
            raw_to_print += raw_pcl_commands;
#if PJL
            raw_to_print += raw_end_of_file;
#endif

            byte[] myEncoded_bytes = Encoding.UTF8.GetBytes(raw_to_print);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //Not supported on CE
            //socket.NoDelay = true;
            int printerPort = 9100;
            IPAddress ip = IPAddress.Parse(printer_ip);
            IPEndPoint ipEndPoint = new IPEndPoint(ip, printerPort);
            socket.Connect(ipEndPoint);
            socket.Send(myEncoded_bytes);
            socket.Close();
        }