Печать с помощью EPL через PHP: хранение изображений
Исходная информация:
Mac OS X Lion 10.7.3 (11D50b)
EPL: http://en.wikipedia.org/wiki/Eltron_Programming_Language
Руководство EPL: http://www.geksagon.ru/i/2/EPL2_Manual.pdf
Я подключаюсь к принтеру через 2-портовый последовательный порт к серверу Ethernet.
Считывание конфигурации принтера:
UKQ1935H U UPS V4.14
S/N: 64A024100181
Serial port:96,N,8,1
Image buffer size:0245K
Fmem:001.0K,059.9K avl
Gmem:000K,0058K avl
Emem:010K,0058K avl
I8,C,001 rY
S4 D10 R000,000 ZT UN
q832 Q609,24
Option:D
oUs,t,u
10 19 29
С помощью PHP я могу отправлять команды на принтер EPL.
Я могу отправить штрих-коды и ASCII линии без проблем.
Я могу хранить изображения, а затем использовать их.
Проблема:
Когда я смешиваю двоичные данные с любыми другими странными командами, они ломаются.
Пример:
<?php
$filename = WWW_ROOT . 'img/labels/mylogo.pcx';
$handle = fopen( $filename , 'r' );
$image = fread( $handle , filesize( $filename ) );
$bytes = strlen( $image );
fclose( $handle );
# Store the image.
# Delete twice when dealing with Printer Flash
$commands = array(
'GK"MYLOGO"', # Del
'GK"MYLOGO"', # Del
'GM"MYLOGO"' . $image_bytes, # Store
$image_data # Binary data
);
?>
Это прекрасно работает само по себе.
Это также работает нормально - если запустить по отдельному запросу:
<?php
$commands = array(
'', # <-- As per the manual, a blank line prior to a new label.
'N', # Clear Image Buffer, New Label
'GG30,10,"MYLOGO"', # Get image variable MYLOGO
'P' # Print
);
?>
Таким образом, после сохранения изображения MYLOGO закончит печать сохраненного логотипа.
Но если я сделаю это:
<?php
$commands = array(
'GK"MYLOGO"', # Del
'GK"MYLOGO"', # Del
'GM"MYLOGO"' . $image_bytes, # Store
$image_data, # Binary data
'', # <-- As per the manual, a blank line prior to a new label.
'N', # Clear Image Buffer, New Label
'GG30,10,"MYLOGO"', # Get image variable MYLOGO
'P' # Print
);
?>
Он печатает логотип, но затем начинает зависать.
Если бы у меня были инструкции ASCII, они не были бы выполнены должным образом.
Выполнение дампа с принтера показывает, что выполняется первая последовательность команд, но как только она попадает в двоичные данные, она начинает получать ее, затем в СРЕДНЕМ и КОНЦЕ двоичных данных она начинает пытаться выполнить следующий набор команд (ASCII команды), а затем двоичный файл продолжается.
Это, конечно, означает, что он не будет печататься... потому что команда P не была получена после данных изображения.
Почему он это делает?
Так что работает: когда к HTTP-запросам делается выдача наборов команд отдельно (новые сокетные соединения).
Это не работает, когда оба набора команд находятся в одном и том же HTTP-запросе.
Если двоичные данные создаются с помощью других команд - принтер переходит в "нечетное" состояние и должен быть выключен и снова включен, чтобы снова начать получать команды.
Конечная цель: быть в состоянии передавать двоичные данные с другими командами, и они не имеют запор.
Пример кода: https://gist.github.com/de3a1ba2f0decc36b6e6
Изображений
Вход в свалку: http://imageshack.us/photo/my-images/193/photo1any.jpg/
Верхняя часть свалки: http://imageshack.us/photo/my-images/37/photo2ln.jpg/
Появляется в середине свалки: http://imageshack.us/photo/my-images/820/photosaz.jpg/
Как это "должно" выглядеть: http://imageshack.us/photo/my-images/832/photo5uc.jpg/
Как это выглядит только с ASCII и штрих-кодами: http://imageshack.us/photo/my-images/23/photo4ucf.jpg/
Как это выглядит запутано: http://imageshack.us/photo/my-images/708/photo3si.jpg/
Обновление 1: другой разработчик попробовал что-то, и это, возможно, сработало, нужно провести дополнительное тестирование, но... по НЕКОТОРЫМ причинам... использование 4 новых строк после сохранения изображения, похоже, работает... это не описано в руководстве,
Обновление 2: после дополнительного тестирования добавление новых строк "улучшает" ситуацию, но не исправляет ее.
Обновление 3: после дополнительного тестирования, я думаю, проблема может быть сужена до следующего:
Если вы запустите команду STORE один раз, все в порядке. Запуск его снова вызывает судороги.
Обновление 4. Похоже, что это проблема самого принтера или его подключения к приложению. Позвонил клиенту и распечатал его на расстоянии, и это, кажется, работает отлично.
1 ответ
Согласно Обновлению № 4: Это, похоже, проблема с самим принтером или с тем, как он подключен к приложению. Позвонил клиенту и распечатал его на расстоянии, и это, кажется, работает отлично.