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

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

1320
0


      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
ЧИТАТЬ ТАКЖЕ:  Microsoft ASP.NET 4 с примерами на C# 2010 для профессионалов: Справочник по C#

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

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

0.00 (0%) 0 votes

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь