PJL (HP Printer Job Language)

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

      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@PJL\r\n" +
  "@PJL SET SERVICEMODE=HPBOISEID\r\n" +
  "@PJL SET PAGES={0}\r\n" +
  "@PJL SET SERVICEMODE=EXIT\r\n" +
  "\x1B%-12345X\r\n", 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 JOB\r\n");               
    writer.Write("@PJL RESET\r\n");
    writer.Write("\x1B%-12345X\r\n");

    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@PJL\r\n"+
    "@PJL DMINFO ASCIIHEX = \"04000401010502040103\"\r\n"+
    "\x1B%-12345X\r\n");

    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@PJL\r\n" +
    "@PJL DMINFO ASCIIHEX = \"04000401010502040109\"\r\n" +
    "\x1B%-12345X\r\n");

    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@PJL\r\n" +
    "@PJL SET LANG = ENGLISH\r\n" +
    "\x1B%-12345X\r\n");

    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@PJL\r\n" +
    "@PJL SET SERVICEMODE=HPBOISEID\r\n" +
    "@PJL SET PAGES=0\r\n" +
    "@PJL SET SERVICEMODE=EXIT\r\n" +
    "\x1B%-12345X\r\n");

    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@PJL\r\n" +
"@PJL INFO ID\r\n" +            
"\x1B%-12345X\r\n");

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@PJL\r\n" +
"@PJL INFO PAGECOUNT\r\n" +
"\x1B%-12345X\r\n");

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@PJL\r\n" +
"@PJL INFO MEMORY\r\n" +
"\x1B%-12345X\r\n");

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@PJL\r\n" +
"@PJL INFO STATUS\r\n" +
"\x1B%-12345X\r\n");

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

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


Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!