Справочник по C#

    Исходники по языку программирования CSharp

    PJL (HP Printer Job Language): Справочник по C#

    /
    /
    /
    153 Views


          PJL (HP Printer Job Language) – это разработанный Hewlett Packard язык , реализующий уровень контроля заданий и расширенного управления принтером. Так, например, он обеспечивает переключение между языками для документов, вывод сообщений на контрольную панель, настройку конфигурации, команды по управлению файловой системой принтера и многое-многое другое. PJL-совместимый принтер также может отправлять информацию, такую как модель принтера и состояние задания на сервер печати.
    Команды PJL обычно имеют следующий формат:
    < ESC > %-12345X@PJLrn
    @PJL INFO IDrn
    < ESC > %-12345Xrn

          Esc имеет десятичный код 27 (Hex код 1В). Этот код выдается как обычный символ, но он не печатается, а переводит принтер в режим приёма команды. Символы, следующие за ним, воспринимаются принтером как команда управления. Принтер пытается распознать их как команду, входящую в его набор команд и если это ему удается, то он ее выполняет. Следующие за командой символы воспринимаются как обычный текст, предназначенный для печати (конечно, если это не следующая Esc последовательность).

    Предупреждение: Принтеры разных фирм изготовителей имеют различные системы команд (Esc последовательностей), и, именно поэтому, нет универсальных драйверов, а для каждого принтера требуется свой драйвер. Более того, даже принтеры одной и той же фирмы могут иметь разные системы команд.

          Получить информацию о Esc последовательностях можно либо из Технического описания принтера, либо зайдя на сервер соответствующей фирмы (например, www.hp.com фирма Hewlett-Packard). Информация, представленная там обычно на английском языке.
    Посмотреть команды можно и другим способом:
         Создайте в Microsoft Word новый документ, в инструкции используется Microsoft Office 2010. Перейдите в меню «Файл» – «Печать». В меню выбора принтера в самом низу присутствует кнопка «Печать в файл», нажмите на нее. Если вы все сделали правильно, то у вас напротив этой надписи появится галочка. Нажмите на кнопку «Печать», у вас откроется диалоговое окно с предложением сохранить файл с расширением «*.prn». Файл с таким расширением будет содержать «Esc» последовательности, для того принтера, который Microsoft Word использует в данный момент. Этот файл можно посмотреть в редакторе, читающий HEX формат, т.к. файл этот двоичный.
          Для отправки команд на принтер воспользуемся поддержкой сокетов TCP на платформе .NET, классом TcpClient. Класс TcpClient обеспечивает TCP-сервисы для соединений на стороне клиента. В отличие от класса Socket, в котором для отправки и получения данных применяется побайтовый подход, классы TcpClient и TcpListener придерживаются потоковой модели.
          В этих классах все взаимодействие между клиентом и сервером базируется на потоке с использованием класса NetworkStream.
          Для обработки на уровне потока, используется класс NetworkStream. Прежде чем отправлять и получать любые данные, нужно определить базовый поток. Класс TcpClient предоставляет метод GetStream() исключительно для этих целей. С помощью базового сокета он создает экземпляр класса NetworkStream и возвращает его вызывающей программе.
          Создайте проект Windows Form в Microsoft Visual Studio и добавьте три компонента на форму:

    • Button1 – Кнопка отправки команд на принтер;
    • textBox1 – Текстовое поле для ввода Ip адреса принтера;
    • textBox2 – Текстовое поле для ввода значений.

          Сделайте двойной клик по компоненту Button1 и перейдите в автоматически созданный метод button1_Click. Для подключения к принтеру создадим объект TcpClient, с указанием в качестве IP адреса textBox1, порт для подключения укажите 9100:

    TcpClient client = new TcpClient(textBox1.Text, 9100);

          Для обеспечения базового потока данных для доступа к сети, как канал между вашим приложением и принтером, используется класс NetworkStream. Прежде чем отправлять и получать любые данные, нужно определить базовый поток. Класс TcpClient предоставляет метод GetStream() исключительно для этих целей. С помощью базового сокета он создает экземпляр класса NetworkStream и возвращает его вызывающей программе.

    NetworkStream stream = client.GetStream();

          Чтобы отправить команду, ее необходимо представить в виде массива типа Byte, содержащий данные для записи в объект NetworkStream. Ниже приведен пример установки счетчика печати:

    Byte[] data = System.Text.Encoding.ASCII.GetBytes(string.Format(
    "x1B_%-12345X@PJLrn" +
    "@PJL SET SERVICEMODE=HPBOISEIDrn" +
    "@PJL SET PAGES={0}rn" +
    "@PJL SET SERVICEMODE=EXITrn" +
    "x1B%-12345Xrn", textBox2.Text));
    

          Что бы отправить данные воспользуемся методом Write(), который принимает три параметра: массив байтов, содержащий данные, которые надо отправить хосту, позицию в потоке, с которой хотим начать запись, и длину данных:

    stream.Write(data, 0, data.Length);

    По окончании работы с принтером необходимо закрыть подключение:

    client.Close();

          Запустите ваш проект, нажав на клавишу «F5», введите IP адрес принтера и ваше значение, нажмите на единственную вашу кнопку. Если все прошло успешно, то результат вы можете посмотреть как на веб страничке принтера.
    Ниже приведены примеры других команд:
    Пробуждение принтера из спящего (энергосберегающего) режима:

    try
    {
    TcpClient client = new TcpClient(textBox1.Text, 9100);
    System.IO.StreamWriter writer = new System.IO.StreamWriter(client.GetStream());
    
    writer.Write("x1B%-12345X@PJL JOBrn");
    writer.Write("@PJL RESETrn");
    writer.Write("x1B%-12345Xrn");
    
    writer.Flush();
    writer.Close();
    client.Close();
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }

    Печать конфигурации принтера:

    try
    {
    TcpClient client = new TcpClient(textBox1.Text, 9100);
    
    Byte[] data = System.Text.Encoding.ASCII.GetBytes(
    "x1B_%-12345X@PJLrn"+
    "@PJL DMINFO ASCIIHEX = "04000401010502040103"rn"+
    "x1B%-12345Xrn");
    
    NetworkStream stream = client.GetStream();
    stream.Write(data, 0, data.Length);
    client.Close();
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }

    Печать карты меню:

    try
    {
    TcpClient client = new TcpClient(textBox1.Text, 9100);
    Byte[] data = System.Text.Encoding.ASCII.GetBytes(
    "x1B_%-12345X@PJLrn" +
    "@PJL DMINFO ASCIIHEX = "04000401010502040109"rn" +
    "x1B%-12345Xrn");
    
    NetworkStream stream = client.GetStream();
    stream.Write(data, 0, data.Length);
    client.Close();
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    Дополнительная информация:
    [ESC]%-12345X@PJL
    @PJL COMMENT Configuration Page
    @PJL DMINFO ASCIIHEX = “04000401010502040103”
    @PJL COMMENT Event Log
    @PJL DMINFO ASCIIHEX = “04000401010502040107”
    @PJL COMMENT File System Directory
    @PJL DMINFO ASCIIHEX = “04000401010502040108”
    @PJL COMMENT Menu Map
    @PJL DMINFO ASCIIHEX = “04000401010502040109”
    @PJL COMMENT Pcl Font Listing
    @PJL DMINFO ASCIIHEX = “040004010105020402015E”
    @PJL COMMENT PS Font Listing
    @PJL DMINFO ASCIIHEX = “04000401010502040201C2”
    [ESC]%-12345X

    Установка английского языка принтера:

    try
    {
    TcpClient client = new TcpClient(textBox1.Text, 9100);
    Byte[] data = System.Text.Encoding.ASCII.GetBytes(
    
    "x1B_%-12345X@PJLrn" +
    "@PJL SET LANG = ENGLISHrn" +
    "x1B%-12345Xrn");
    
    NetworkStream stream = client.GetStream();
    stream.Write(data, 0, data.Length);
    client.Close();
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    Дополнительная информация:
    Для установки русского языка замените «ENGLISH» на «RUSSIAN».

    Сброс счетчика печати принтера на ноль:

    try
    {
    TcpClient client = new TcpClient(textBox1.Text, 9100);
    
    Byte[] data = System.Text.Encoding.ASCII.GetBytes(
    "x1B_%-12345X@PJLrn" +
    "@PJL SET SERVICEMODE=HPBOISEIDrn" +
    "@PJL SET PAGES=0rn" +
    "@PJL SET SERVICEMODE=EXITrn" +
    "x1B%-12345Xrn");
    
    NetworkStream stream = client.GetStream();
    stream.Write(data, 0, data.Length);
    client.Close();
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }

    Язык PJL также позволяет получать информацию от принтера. Например, модель:

    TcpClient client = new TcpClient(textBox1.Text, 9100);
    
    Byte[] data = System.Text.Encoding.ASCII.GetBytes(
    "x1B_%-12345X@PJLrn" +
    "@PJL INFO IDrn" +
    "x1B%-12345Xrn");
    
    NetworkStream stream = client.GetStream();
    stream.Write(data, 0, data.Length);
    data = new Byte[256];
    String responseData = String.Empty;
    Int32 bytes = stream.Read(data, 0, data.Length);
    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
    MessageBox.Show(string.Format("Информация с принтера: {0}", responseData));
    stream.Close();

    Результат выполнения:

    Счетчик печати:

    TcpClient client = new TcpClient(textBox1.Text, 9100);
    
    Byte[] data = System.Text.Encoding.ASCII.GetBytes(
    "x1B_%-12345X@PJLrn" +
    "@PJL INFO PAGECOUNTrn" +
    "x1B%-12345Xrn");
    
    NetworkStream stream = client.GetStream();
    stream.Write(data, 0, data.Length);
    data = new Byte[256];
    String responseData = String.Empty;
    Int32 bytes = stream.Read(data, 0, data.Length);
    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
    MessageBox.Show(string.Format("Информация с принтера: {0}", responseData));
    stream.Close();

    Результат выполнения:

    Состояние памяти принтера:

    TcpClient client = new TcpClient(textBox1.Text, 9100);
    
    Byte[] data = System.Text.Encoding.ASCII.GetBytes(
    "x1B_%-12345X@PJLrn" +
    "@PJL INFO MEMORYrn" +
    "x1B%-12345Xrn");
    
    NetworkStream stream = client.GetStream();
    stream.Write(data, 0, data.Length);
    data = new Byte[256];
    String responseData = String.Empty;
    Int32 bytes = stream.Read(data, 0, data.Length);
    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
    MessageBox.Show(string.Format("Информация с принтера: {0}", responseData));
    stream.Close();

    Результат выполнения:

    Статус принтера:

    TcpClient client = new TcpClient(textBox1.Text, 9100);
    
    Byte[] data = System.Text.Encoding.ASCII.GetBytes(
    "x1B_%-12345X@PJLrn" +
    "@PJL INFO STATUSrn" +
    "x1B%-12345Xrn");
    
    NetworkStream stream = client.GetStream();
    stream.Write(data, 0, data.Length);
    data = new Byte[256];
    String responseData = String.Empty;
    Int32 bytes = stream.Read(data, 0, data.Length);
    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
    MessageBox.Show(string.Format("Информация с принтера: {0}", responseData));
    stream.Close();

    Результат работы:

          В случае если принтер не понимает вашу команду, которую вы ему отправили, то он ответит знаком вопроса «?»:

    Протестировано на следующих моделях:

    • HP Color LaserJet 3600
    • HP Color LaserJet 4650
    • HP Color LaserJet 5550
    • HP Color LaserJet CP3525
    • HP Color LaserJet CP5520 
    • HP Designjet 1055
    • HP Designjet 4020
    • HP Designjet T790
    • HP LaserJet 4050
    • HP LaserJet 4200
    • HP LaserJet 4250
    • HP LaserJet 500 MFP M525
    • HP LaserJet 5000
    • HP LaserJet 5100
    • HP LaserJet 5200
    • HP LaserJet 9040
    • HP LaserJet M1536 
    • HP LaserJet M3035 
    • HP LaserJet M5035
    • HP LaserJet M725
    • HP LaserJet P2055
    • Xerox WorkCentre 5225
    • Xerox WorkCentre 7428

    Ссылка для скачивания примера: Яндекс.Диск

    PJL (HP Printer Job Language): Справочник по C#

    0.00 (0%) 0 votes

    moyadcode13
    • Facebook
    • Twitter
    • Google+
    • Linkedin
    • Pinterest
    moyadcode10
    moyadcode11
    moyadcode9