LINUX.ORG.RU

Настройка Epson LX-1050+ в Debian 8

 


1

1

К ноутбуку через переходник USB→LPT подключен принтер. DIP-переключатели выставлены так: 1(1-5)→On 1(6)→Off 2(1-4)→Off. В настройках CUPS выбран драйвер «eps9high». Печать предполагается на формате A4. PPD-файл модифицирован с целью увеличения области печати до максимальной — изменены следующие строки:

*1284DeviceID: «DRV:Deps9high;» — изменение вроде не повлияло ни на что. Что дают параметры по умолчанию «R0,M0,F1,P0,TG» ?

*HWMargins: 0 0 0 0

*ParamCustomPageSize Width: 1 points 0 100000

*ParamCustomPageSize Height: 2 points 0 100000

*FoomaticRIPOptionSetting PageSize=A4: " -dDEVICEWIDTHPOINTS=595 -dDEVICEHEIGHTPOINTS=842"

*ImageableArea A4/A4: «0 0 595 842»

*PaperDimension A4/A4: «595 842»

Остальное не трогал. После включения принтера, вставки листа и нажатия кнопки «ON LINE» принтер втягивает лист так, что верхний край листа встает напротив головы. Но когда начинается печать, например пробная страница в веб-интерфейсе CUPS, принтер сначала прокручивает примерно 10 мм, т.е. переводит строку наверно сам, и получается верхнее поле, соответственно последняя строка на странице не печатается и принтер требует новый лист для нее, или страница на бумаге получается смещенной вниз.

Подскажите пожалуйста, есть ли команда принтера (<ESC>... ), которая открутит бумагу на строку назад перед началом печати каждой страницы? И куда эту команду вставить — в PPD-файл ? Или может быть еще как-то победить проблему?

Если честно, то с LX мало помогу. Был у меня принтер Siemens-Nixdorf ND49 - полный аналог LQ-1050+. Я для него писал PPD на основе ёпсоновских PPD-шек. И да вот нашел. Я выложил на pastebin.com. Посмотри. Может быть, поможет чем-нибудь. Я уже просто забыл, что я там делал, поэтому предметно сейчас без принтера не помогу.

http://pastebin.com/Yjhha3Tv

Zubok ★★★★★ ()
Ответ на: комментарий от Coyote112358

Мне кажется, что ты борешься с HW Margins. Они есть у любого такого принтера. И у этого LX есть. Он их отступает. Надо их правильно указать в PPD, чтобы программа, которая рендерит страничку учитывала их. Если ты их занулишь (а ты вроде именно что занулил), то программа будет считать, что они нулевые, но принтер так считать все равно не будет и отступит. И область печати тоже надо правильно указать.

Подать команды на отмотку назад теоретически можно, но вот я что-то сомневаюсь насчет того, что это в PPD. Я как-то такого не делал. Мне кажется, что это в фильтры надо лезть.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Мне кажется, что это в фильтры надо лезть.

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

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Да, думаю, что CUPS filters тебе и нужно.

Не, надо ловить вывод ghostscript и перед ним вставлять нужные команды. Прямо перед передачей в порт. То есть твой фильтр должны быть последним в цепочке, то есть после epson9high уже.

Вот тут какие-то привмрчики есть, в этом разделе:

https://en.opensuse.org/SDB:Using_Your_Own_Filters_to_Print_with_CUPS#Optiona...

Там есть пример, как перед печатью в принтер подается специфическая команда на PCL, А потом управление ппередается gs. То есть ты перед gs подаешь команду на отмотку, а затем вызываешь gs.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Вот тут какие-то примерчики есть, в этом разделе:

Начиная со слов: Many PostScript+PCL printers understand the job control language PJL. If your printer does not switch automatically from PostScript to PCL but supports PJL, the switch can be forced with PJL commands.

/usr/lib/cups/filter/PsToPCL can be expanded to enable the corresponding PJL commands to be sent before and after the PCL data:

Zubok ★★★★★ ()

*HWMargins: 0 0 0 0

Просто вот это - это попытка обмануть принтер, но он этого не поймет. Программу ты обманешь, так как она подумает, что технологических отступов нет, но принтер не обманешь. В типовом эпсоновском драйвере прописано:

*HWMargins: 18 36 18 36

*ImageableArea A4/A4: «18 36 577 806»

Принтер делает отступ принципиально, а не из-за ошибки. Вот у меня принтер имел верхнюю границу где-то 5-6 мм.

Поэтому если хочешь его обмануть, надо ему перед печатью кое-что скомандовать. Интересно, что получится.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)

Я нашел в документе EPSON ESC/P Reference Manual December 1997 (стр. 214) команду Reverse paper feed для открутки бумаги назад. Если в консоли выполнить

echo -e "\x1B\x6A\xFF" > /dev/usb/lp1
бумага действительно откручивается назад примерно на 3 см. и сразу прокручивается вперед на 1 строку. Создается впечатление, что кто-то (может быть переходник USB→LPT) отправляет еще какой-то байт в конце, который воспринимается принтером как «CR»...

Можно ли как-нибудь сделать, чтобы эта команда выполнялась перед печатью?

Coyote112358 ()
Ответ на: комментарий от Coyote112358

Ты когда отвечаешь, отвечай, плиз, мне, если ты ко мне обращаешься, потому что я не вижу уведомлений, что ты ответил. Внизу есть ссылка «Ответить на это сообщение».

Можно ли как-нибудь сделать, чтобы эта команда выполнялась перед печатью?

Это я за тебя поискал.

Настройка Epson LX-1050+ в Debian 8 (комментарий)

Настройка Epson LX-1050+ в Debian 8 (комментарий)

Пишешь маленький скриптик, как в примере, где перед вызовом gs вставляешь свою строчку, но без /dev/usb/lp1. Фильтр сам все направит в нужный порт. Дальше надо в PPD указать, что при печати надо использовать этот фильтр. Все должно заработать. Пробуй.

бумага действительно откручивается назад примерно на 3 см. и сразу прокручивается вперед на 1 строку. Создается впечатление, что кто-то (может быть переходник USB→LPT) отправляет еще какой-то байт в конце, который воспринимается принтером как «CR»...

Нелепость какая-то и теория заговоров переходников USB->LPT. Я предполагаю, что принтеру надо прокрутить бумагу, чтобы она надежно сидела, прокручивалась и гарантировано прижималась валиками. Поэтому и существует технологическое поле сверху. А снизу оно существует, потому что когда бумага в самом низу печати, ее по-прежнему надо как-то протягивать и какой-то хоть краешек должен быть. Иначе не гарантируется, что бумага не сместится и не сомнется головкой. Это технологическое поле снизу. Скорее всего, принтер смотрит какой-то датчик. Если край бумаги слишком вниз уполз, то он бумагу вперед подкручивает. Как-то так.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 6)

Покажи свой PPD (на pastebin.com). Хочу глянуть, какой фильтр у тебя используется. У меня использовался rastertoepson. Он указывается в параметре *cupsFilter.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Вот из User manual твоего принтера.

Top: min 22 mm (note 1)

Bottom: min 22 mm (note 2)

Notes:

1. In the area from 8.5 mm to 22 mm from the top of paper it is printable but paper-feed is not assured.

2. In the area from 13.5 mm to 22mm from the bottom of the paper, it is ptintable but paper-feed is not assured.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Coyote112358

Я пока не понимаю, как сделать свой CUPS-фильтр. Отредактировать тот, который сейчас используется, можно?

Ну, странно, ты уже научился в порт команды передавать, а коротенький скриптик сделать не можешь. У тебя используется фильтр foomatic-rip. Это универсальный фильтр, который в конце вызывает gs с драйверов eps9high для растеризации картинки. Этот фильтр - исполняемый бинарный файл, не скрипт. Ясно, что ты не можешь его изменить. Твой фильтр, который надо написать, это враппер, который foomatic-rip просто перевызывает. Фильтром может быть как скрипт, так и программа. На вход принимает шесть параметров, шестой из которых - файл.

Ну, я не знаю тогда. Можешь эксперимент поставить. Впиши в PPD вместо

*FoomaticRIPCommandLine: "gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
USE -dNOINTERPOLATE -sDEVICE=eps9mid%A%Z -sOutputFile=- -"

вот это:

*FoomaticRIPCommandLine: "echo -e &apos;\x1B\x6A\xFF&apos; > /dev/usb/lp1 && gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPA&&
USE -dNOINTERPOLATE -sDEVICE=eps9mid%A%Z -sOutputFile=- -"

Интересно, сработает ли. Но это криво, потому что тебе тут явно надо указывать порт. И если принтер порт поменяет, то все... С фильтром же проблем быть не должно.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Zubok

Только замени > и && после lp1 в соответствии с man foomatic-rip. Лор сожрал мою замену и назад заменил. Символы && в PPD - это перенос строки . Сейчас багрепорт напишу.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 3)
Ответ на: комментарий от Coyote112358

Открутилась на FF, но не напечатал ничего. Т.е. до gs дело не дошло...

А покажи, как ты вписал вплоть до знака. Лучше на pastebin - тут сжирает символы.

Zubok ★★★★★ ()
Ответ на: комментарий от Coyote112358

Можно бесконечно отправлять на печать файлы и принтер будет крутить бумагу туда-сюда, а печатать не будет.

Coyote112358 ()
Ответ на: комментарий от Zubok

Я создал файл /usr/lib/cups/filter/paperFeedBack, сделал его исполняемым. Содержимое

В файл /usr/share/cups/mime/mime.types вписал строку application/paperFeedBack

В файл /etc/cups/ppd/Epson_9_mid.PPD перед строкой *cupsFilter: «application/vnd.cups-postscript 100 foomatic-rip» вставил *cupsFilter: «application/paperFeedBack 100 foomatic-rip»

далее service cups restart

и ... печатает как раньше печатал

Coyote112358 ()
Ответ на: комментарий от Coyote112358

Я создал файл /usr/lib/cups/filter/paperFeedBack, сделал его исполняемым. Содержимое

Не, ну тогда экранировать не надо.

echo -e "\x1B\x6A\x55" > /dev/usb/lp1

Экранировать надо только когда ты используешь символы внутри PPD.

Ой, слушай. Это ты скрипт такой сделал же. Только сейчас сообразил. Тогда ну хотя бы сделай #! /bin/sh в начале. Но это ты импровизируешь все, но так не должно получиться. Сейчас довыясню.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Zubok

Убрал экранирование

#! /bin/sh echo -e «\x1B\x6A\x55» > /dev/usb/lp1

дело не в этом

PPD-файл

А чтобы CUPS понял, что мой скрипт — это фильтр достаточно имя его вписать в /usr/share/cups/mime/mime.types ?

Coyote112358 ()
Ответ на: комментарий от Coyote112358

Есть *cupsPreFilter, кстати. Не знал. Надо попробовать. Это должно облегчить задачку. MIME оставь тот же. Не надо менять. Просто добавь этот preFilter.

cupsPreFilter

*cupsPreFilter: «source/type cost program»

This string attribute provides a pre-filter rule. The pre-filter program will be inserted in the conversion chain immediately before the filter that accepts the given MIME type.

Examples:

*% PDF pre-filter
*cupsPreFilter: «application/pdf 100 mypdfprefilter»

*% PNG pre-filter
*cupsPreFilter: «image/png 0 mypngprefilter»
Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 3)
Ответ на: комментарий от Zubok

Есть *cupsPreFilter, кстати. Не знал. Надо попробовать. Это должно облегчить задачку. MIME оставь тот же. Не надо менять. Просто добавь этот preFilter.

Да, при этом не надо указывать порт. Он сам направит. Просто вот так для начала попробуй, получится ли что.

#! /bin/sh
set -x
echo -en "\x1B\x6A\x55"
Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Coyote112358

Бумага действительно откручивается назад примерно на 3 см. и сразу прокручивается вперед на 1 строку.

А-а-а, ну так echo надо ключик -n добавить. Так он да - добавит newline. Я указал в скрипте, если что.

Zubok ★★★★★ ()
Ответ на: комментарий от Coyote112358

И не будет, потому что ты не читаешь документацию, а я ее привел целиком.

Настройка Epson LX-1050+ в Debian 8 (комментарий)

The pre-filter program will be inserted in the conversion chain immediately before the filter that accepts the given MIME type.

*cupsPreFilter:    "application/vnd.cups-postscript 100 paperFeedBack"
*cupsPreFilter:    "application/vnd.cups-pdf 0 paperFeedBack"
*cupsFilter:    "application/vnd.cups-postscript 100 foomatic-rip"
*cupsFilter:    "application/vnd.cups-pdf 0 foomatic-rip"

paperFeedBack - это типа скрипт твой. Не знаю, как он зовется. Лежать должен там, где cups ищет фильтры. Хотя бы там же, где и foomatic-rip

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 4)
Ответ на: комментарий от Zubok

Я ведь печатаю от имени обычного пользователя, у которого нет прав записи в устройство /dev/usb/lp1. Может из-за этого не получается?

Coyote112358 ()
Ответ на: комментарий от Coyote112358

Поменяй владельца и права правильно поставь от root:

# chown root:root /usr/lib/cups/filter/paperFeedBack
# chmod 755 /usr/lib/cups/filter/paperFeedBack

и рестартани на всякий случай сервис cups.

Zubok ★★★★★ ()
Ответ на: комментарий от Coyote112358

Я ведь печатаю от имени обычного пользователя, у которого нет прав записи в устройство /dev/usb/lp1. Может из-за этого не получается?

Ну это не про печать ругательство. Печать у тебя работает.

Zubok ★★★★★ ()
Ответ на: комментарий от Coyote112358

Можно обычному пользователю дать права на запись в устройство? Или можно как-то это обойти?

Если ты ранеш как-то печатал, то все права у тебя есть. Ругается он на права скрипта. Что поставить я выше указал

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Но от этого права на запись в устройство не появятся у того пользователя, от имени которого запускается печать и соответственно фильтры. Так?

Coyote112358 ()
Ответ на: комментарий от Zubok

Печатал от обычного пользователя, а команды на открутку посылал от рута.

Coyote112358 ()
Ответ на: комментарий от Coyote112358

Покажи сперва, что в /var/log/cups/error_log по поводу последних изменений.

Zubok ★★★★★ ()
Ответ на: комментарий от Coyote112358

Добавь в скрипт в самый конец exit 0.

Exit Codes

Filters must exit with status 0 when they successfully generate print data or 1 when they encounter an error. Backends can return any of the cups_backend_t constants.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Coyote112358

Сделал так. Но теперь задания помещаются в очередь и там висят.

кажется, я понимаю, почему ничего не происходит. Сейчас тут в документации подробнее посмотрю. Я фильтры эти делаю в первый раз в жизни, как и ты.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

D [31/Jul/2016:23:11:43 +0300] [Job 237] PID 2137 (/usr/lib/cups/filter/pdftopdf) did not catch or ignore signal 13. Выше утверждается, paperFeedBack отработал с кодом 0, но принтер не шевелился и на этом все встало — не может ничего записать в USB.

Coyote112358 ()
Ответ на: комментарий от Zubok

Еще я заметил, что после перезагрузки команда

echo -e «\x1B\x6A\x55» > /dev/usb/lp1

откручивает бумагу нормально, много раз. Но если что-нибудь напечатать через CUPS, то больше она не работает. До следующей перезагрузки.

Coyote112358 ()
Ответ на: комментарий от Coyote112358

Попробуй такой.

#! /bin/sh

set -x
if [ -n "$6" ]; then
    exec <"$6"
fi
echo -en "\x1B\x6A\x55"
cat -
Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Coyote112358

откручивает бумагу нормально, много раз. Но если что-нибудь напечатать через CUPS, то больше она не работает. До следующей перезагрузки.

Может, принтер надо сбросить какой-то командой? Но это уже потом разбираться. Сейчас фильтр работать заставить надо.

Zubok ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.