PJL (HP Printer Job Language) – это разработанный Hewlett Packard язык , реализующий уровень контроля заданий и расширенного управления принтером. Так, например, он обеспечивает переключение между языками для документов, вывод сообщений на контрольную панель, настройку конфигурации, команды по управлению файловой системой принтера и многое-многое другое. PJL-совместимый принтер также может отправлять информацию, такую как модель принтера и состояние задания на сервер печати.
Команды PJL обычно имеют следующий формат:
< ESC > %-12345X@PJLrn
@PJL INFO IDrn
< ESC > %-12345Xrn
Esc имеет десятичный код 27 (Hex код 1В). Этот код выдается как обычный символ, но он не печатается, а переводит принтер в режим приёма команды. Символы, следующие за ним, воспринимаются принтером как команда управления. Принтер пытается распознать их как команду, входящую в его набор команд и если это ему удается, то он ее выполняет. Следующие за командой символы воспринимаются как обычный текст, предназначенный для печати (конечно, если это не следующая 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
Ссылка для скачивания примера: Яндекс.Диск
0.00 (0%) 0 votes









