bz home

Принтер HP LaserJet 1018 в OS/2

Тут я попробую изложить, как мне удалось заставить печатать принтер HP LaserJet 1018 в OS/2. Это не совсем пошаговая инструкция, но понять что и как было сделано не составит особого труда для человека вдумчивого и действительно желающего найти возможность печатать на HP LaserJet 1018 в OS/2.

Думаю, что этот же метод один в один годится для других принтеров этого же семейства (1020 и 1022), а также к ряду других принтеров и, в частности, побочным эффектом можно получить печать в PDF. Собственно печать на принтер является творческим развитием идеи печати в PDF, описанной вот тут.

Как будет решена поставленная задача? Разделим её на несколько подзадач:

  1. Поставим в системе PostScript-принтер, который позволит нам печатать из любого приложения и получать на выходе вывод в формате PS.
  2. Нужно перехватить полученный PostScript-вывод и отправить его на дальнейшую обработку.
  3. Установим GhostScript, с помощью которого можно полученный PS растеризовать в изображение (а при желании, изменив настройки вывода, получить просто PDF).
  4. Полученный растр следует запаковать в протокол, понятный принтеру...
  5. И, собственно, послать на принтер.

Что нам понадобится.

Устанавливаем драйвер принтера

Для печати в 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, то получаются сплошные кракозябры на месте русских букв. Латиница идёт нормально. Так что приходится выбирать: или нормальная печать русского, или иероглифы на страничках. Как совместить — пока не знаю.

Несколько миллиметров внизу страницы не пропечатываются, не влазят на лист. Пока тоже не знаю, что делать.

Благодарности: