Принтер HP LaserJet 1018 в OS/2
Тут я попробую изложить, как мне удалось заставить печатать принтер HP LaserJet 1018 в OS/2. Это не совсем пошаговая инструкция, но понять что и как было сделано не составит особого труда для человека вдумчивого и действительно желающего найти возможность печатать на HP LaserJet 1018 в OS/2.
Думаю, что этот же метод один в один годится для других принтеров этого же семейства (1020 и 1022), а также к ряду других принтеров и, в частности, побочным эффектом можно получить печать в PDF. Собственно печать на принтер является творческим развитием идеи печати в PDF, описанной вот тут.
Как будет решена поставленная задача? Разделим её на несколько подзадач:
- Поставим в системе PostScript-принтер, который позволит нам печатать из любого приложения и получать на выходе вывод в формате PS.
- Нужно перехватить полученный PostScript-вывод и отправить его на дальнейшую обработку.
- Установим GhostScript, с помощью которого можно полученный PS растеризовать в изображение (а при желании, изменив настройки вывода, получить просто PDF).
- Полученный растр следует запаковать в протокол, понятный принтеру...
- И, собственно, послать на принтер.
Что нам понадобится.
Устанавливаем драйвер принтера
Для печати в PS ставим штатными средствами OS/2 любой PS-принтер (драйвер PSCRIPT.DRV, обновления могут быть получены из PSCRIPTEN.EXE). У меня версия этого драйвера 30.827. Впрочем, это не должно играть особой роли.
Я выбрал HP LaserJet 4300 PS, из-за некоторых личных причин. Можно с тем же успехом взять любой другой, главное чтобы он поддерживал печать с разрешением 600x600, что соответствует физическому разрешению принтера hp-1018.
Теперь мы можем печатать в PostScript-е из любого приложения.
Ставим дополнительные программы
GhostScript довольно давно портирован в OS/2 и достаточно стабилен. Следует взять любую подходящую версию (например, вот эту, собранную gcc 3.3.5, или последнюю с официального сайта). В моём случае это была версия 8.53 и я установил её в C:\gs\, где и появились два каталога: C:\gs\gs8.53 и C:\gs\fonts. Запомним эти пути, они нам дальше пригодятся.Следующее, что нужно сделать — поймать PS-вывод для последующей обработки. Это можно сделать массой способов. Например, повесить принтер на порт LPDx и воспользоваться фильтрами. Я сделал это с помощью утилиты PRINTMON. Берём его вот тут, тут или на hobbes-е. Разворачиваем из архива PRINTMON.EXE в какое-нибудь хорошее место, прописанное в PATH.
Теперь последний штрих — берём вот этот файл foo2zjs и распаковываем из него foo2zjs.exe тоже в какое-нибудь хорошее место, прописанное в PATH. Это утилитка для заворачивания подготовленного к печати растра в поток, понятный принтеру (с неплохим сжатием по ходу дела). Желающие могут поинтересоваться подробностями на сайте авторов.
Связываем всё вместе
Небольшое отступление. Теперь у нас всё готово для печати, осталось придумать, как именно будет перехватываться вывод из PS-принтера, и как он будет посылаться на принтер. Дело в том, что у меня принтер подключен к соседней машине под Windows и доступен по сети. Так что я просто зашарил его с помощью net use lpt5 \\win-host\hp1018. То есть в моём случае для отправки на принтер нужно скопировать подготовленное задание на lpt5. Если принтер установлен локально, нужно поставить драйверы поддержки USB-принтеров USBPRINT и придумать, как отправлять подготовленное задание на принтер. Есть подозрение, что достаточно будет скопировать его на $usbprn, но я не проверял. В случае с LPDx, можно(?) отправлять в \PIPE\LPDx. Ну-с, приступим.
Устанавливаем порт для принтера из предыдущего шага на какой-нибудь незадействованный. Пусть это будет LPT3.
Теперь готовим строку запуска перехватчика. Готовим файл hp1018.cmd:
@echo off
setlocal
set GSPATH=C:\gs\gs8.53
set BEGINLIBPATH=%GSPATH%/bin
set GS_LIB=%GSPATH%/lib;%GSPATH%/Resource;%GSPATH%/../fonts
REm resolution 600x600, paper size A4 210x297
printmon LPT3 "%GSPATH%\bin\gsos2.exe -q -dBATCH -dNOPAUSE
-sPAPERSIZE=a4 -g5040x7000 -r600x600 -sDEVICE=pbmraw
-sOutputFile=- - | foo2zjs -g5040x7000 -r600x600 -p9 -z1 >LPT5"
endlocal
Строчка с printmon на самом деле одна, длинная. Я её разбил на три исключительно для наглядности.
Пояснения.
В переменной GSPATH указываем путь к установленному GhostScript, всё это сделано только ради того, чтобы не замусоривать лишний раз CONFIG.SYS не очень-то нужными переменными окружения, остальные пути прописаны как относительные от GSPATH. В вызове printmon первым параметром указан порт LPT3, который мы собираемся перехватывать, а в конце строки идёт перенаправление в LPT5 — это мой вывод непосредственно на принтер.
Теперь осталось только запустить hp1018.cmd в каком-нибудь подходящем для этого месте, например, из STARTUP.CMD или вручную командой start /min "hp1018" hp1018.cmd.
Всё!
Замечания
Пара замечаний.
HP LaserJet 1018 требует после включения загрузки своего ПО. Оно не хранится в ROM принтера, вместо этого оно должно каждый раз грузиться ему в оперативную память извне. Подробности на странице foo2zjs. В моём случае это делает компьютер, к которому непосредственно подключен принтер, своими штатными драйверами от производителя, так что никаких дополнительных телодвижений не надо было. Кому-то может понадобятся.
Долго искал в чём дело. Броузеры, построенные на движке Gecko (Mozilla, FireFox, SeaMonkey) печатают на PS-принтер правильно только если при их запуске не была заданна переменная окружения MOZILLA_USE_EXTENDED_FT2LIB=T. Увы, если воспользоваться расширениями FT2LIB, то получаются сплошные кракозябры на месте русских букв. Латиница идёт нормально. Так что приходится выбирать: или нормальная печать русского, или иероглифы на страничках. Как совместить — пока не знаю.
Несколько миллиметров внизу страницы не пропечатываются, не влазят на лист. Пока тоже не знаю, что делать.
Благодарности:
- banshee за базовую методику прикручивания GhostScript в соответствующей статье
- yaroslavs за помощь в поисках виноватого в кривой печати из броузеров
- отдельным завсегдатаям канала #os2russian за полезные советы и моральную поддержку.