Компактная рамка Печать документов - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь распечатать документ на сетевом лазерном принтере с устройства Windows CE. Так как я пытаюсь напечатать образец текста, проблем нет, и я могу сделать это с помощью сокетов, моя проблема заключается в том, что мне нужно напечатать текст и небольшое изображение под текстом, например:

not formatted text
------------------
|    IMAGE       |
------------------
other not formatted text

Моей первой идеей было создать документ Rtf и отправить его на принтерные носки принтера, но он, очевидно, печатает текстовое содержимое документа, а не отформатированный текст ... Я пытаюсь использовать множество других способов кодирования данных для отправки, но без результатов ... есть способ сделать это, или я только трачу свое время? Если нет, есть ли способ архивации, который отправляет данные 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_bytes составляют:

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

спасибо за помощь,

Легион

P.S .: Внешняя библиотека не разрешена, поэтому я не могу использовать printCE или аналогичные «подсказки».

1 Ответ

0 голосов
/ 29 мая 2018

Извините, я пытаюсь лучше объяснить, как я достигаю цели, это пример функции, которая создается после @josef link , я пишу какой-то текст в выбранной позиции и рисую красную рамку в центре экран (комментарии объясняют, как работают команды pcl). Следуя руководству PCL, вы можете легко настроить текст и рисунки по своему усмотрению ( HERE_AN_HP_MANUAL ).

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

Теперь для изображений у вас есть 2 способа следовать:

1) Нарисуйте изображение «вручную» с помощью команд PCL, см. На стр. 41 этого руководства , чтобы увидеть некоторые примеры (если проще, как в моем случае, то лучше всего использовать простой штрих-код способ следовать).

2) Нарисуйте изображение с помощью макроса PCL .... это все, что я могу сказать, потому что чтение этой документации вызывает у меня головную боль и вынуждает меня выбрать метод 1: D

Надеюсь, это поможет, Легион

...