Когато имате PostScript принтер Вие
просто нямате никакви проблеми да печатате под Linux. Не е така обаче, ако принтерът
Ви не е PostScript, а масовите принтери са именно такива.
Правилото гласи, че трябва да използвате
ghostscript, което е основният начин да се справите с проблема.
Някои програми като WordPerfect предлагат собствени
драйвери за някои принтери. Тъй като ghostscript растеризира цялата страница и я
печата като голяма графика, а драйверите на WordPerfect използват вградените шрифтове
на принтера (или upload-ват такива при някои модели) може да се окаже, че скоростта на
печат е по-добра в сравнение с тази при използването на ghostscript. Но понякога пък не
може да се постигне качеството, което дава ghostscript. Трябва да се пробват и двата
начина и да се прецени кой е по-добрият в конкретната ситуация.
Инсталиране на HP DeskJet принтер под Linux
(Как си пуснах моят HP DeskJet 400 можете да прочетете тук.)
Kak става печатането? Когато системата
се зарежда се стартира и lpd-демона (Line Printer Daemon). Той търси файла
/etc/printcap за да разбере на какви принтери ще управлява спулирането. Всеки път,
когато някой стартира lpr - user-командата за обръщение към спулера (lpr се обръща към
lpd през /dev/printer и вкарва нова задача за печат в спулера). lpd узнава, че
трябва да печата, както и получава информация за това кой подава задачата и как трябва
да бъде отпечатана. След това lpd отпечатва задачата на съответния принтер.
Тази система е още от времето, когато повечето принтери
са били наистина line (линейни) - хората са печатали изключително ASCII текст. Сега е
необходимо само малко допълнение за да се накара lpd да посрещне съвременните изисквания
за печат.
Toва, което трябва да се направи за да се конфигурира
принтера за работа под Linux e да се добави oпашка за lpd и съответно да се добави
запис в /etc/printcap за тази опашка, kakто разбира се и да се създаде самата
директория за спулера в /var/spool/lpd.
Toзи запис изглежда така:
# LOCAL djet500
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:sh:
Горният код дефинира спулер, наречен lp, dj или deskjet в
директорията /var/spool/lpd/dj, без ограничения в размера на файла, който ще се
печата на устройството /dev/lp0.
До тук добре, но ще забележите, че принтерът Ви (може би)
се държи малко странно. Например да не разбира края на реда или да печата стъпаловидно.
Ефектите са различни за различните принтери. Възниква нуждата от филтър, който да улавя
и коригира странностите на принтера. Това става с добавянето на един if
оператор в нашия /etc/printcap файл и той вече изглежда така:
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:if=/var/spool/lpd/dj/filter:\
:sh:
       А самият филтър може да бъде скрипт като този:
#!perl
# The above line should really have the whole path to perl
# This script must be executable: chmod 755 filter
while(<STDIN>){chop $_; print "$_\r\n";};
# You might also want to end with a form feed: print "\f";
Вероятно ще Ви се наложи да си направите няколко такива
филтъра, които да управляват принтера по различен начин за различните ситуации.
Вече се сещате, нали, че хубаво би било ако този филтър
може да разпознава какъв тип документ ще се печата и сам да си сменя поведението.
Разбира се, че има такива - oбикновено се наричат "magic филтри". Много
популярен е APS филтъра, но Вашата Linux дистрибуция може да успява да управлява
принтерът Ви още по-добре.
Трябва да си оправите правата на файловете и директориите,
свързани с печата. Могат да изглеждат примерно така:
-r-sr-sr-x 1 root lp /usr/bin/lpr*
-r-sr-sr-x 1 root lp /usr/bin/lprm*
-rwxr--r-- 1 root root /usr/sbin/lpd*
-r-xr-sr-x 1 root lp /usr/sbin/lpc*
drwxrwxr-x 4 root lp /var/spool/lpd/
drwxr-xr-x 2 root lp /var/spool/lpd/lp/
Можете да си вземете готови филтри от Metalab, както
и друг софтуер за печат.
Сега остава да си запуснете ghostscript-a.
Винаги, когато стартирате gs го правете с опцията -dSAFER за да си спестите излишни
главоболия. Не забравяйте, че PostScript е съвсем
пълноценен език за програмиране и колкото е мощен за да ви създаде удобства, така и можете
да свършите големи поразии.
  Обикновено gs се стартира от magic филтъра. gs -help ще
ви даде информация за опциите и за компилираните в ghostscript драйвери.
Можете да пробвате следния ред за тестване на gs:
gs options -q -dSAFER -sOutputFile=/dev/lp1 test.ps
Нека да разгледаме един конкретен
пример
Ще използваме magic филтър и нашият /etc/printcap файл
ще изглежда така:
#best=600x600,norm=300x300(300x600 for plain text), draft=150x150)
lp|dj|dj600|HP DeskJet 600:\
:lp=/dev/lp1:sd=/var/spool/lpd/dj600:\
:sh:pw#80:pl#72:px#1440:mx#0:\
:rf=/usr/sbin/dj600m-best-filter:\
:if=/usr/sbin/dj600m-norm-filter:\
:df=/usr/sbin/dj600m-draft-filter:\
:nf=/usr/sbin/dj600m-quick-filter:\
:gf=/usr/sbin/dj600c-best-filter:\
:cf=/usr/sbin/dj600c-norm-filter:\
:tf=/usr/sbin/dj600c-draft-filter:\
:vf=/usr/sbin/dj600c-quick-filter:\
:af=/var/log/lp-acct:lf=/var/log/lp-errs:
djc|dj600c|HP DeskJet 600c:\
:lp=/dev/lp1:sd=/var/spool/lpd/dj600c:\
:sh:pw#80:pl#72:px#1440:mx#0:\
:if=/usr/sbin/dj600c-norm-filter:\
:df=/usr/sbin/dj600c-draft-filter:\
:rf=/usr/sbin/dj600c-best-filter:\
:af=/var/log/lp-acct:lf=/var/log/lp-errs:
Всъщност тук става въпрос за два принтера - черно-бял и цветен.
- lp=/dev/lp1
- Дефинираме устройството и порта.
- sd=/var/spool/lpd/dj600
- А тук спулинг директорията.
- sh
- Не искаме да печатаме заглавна страница.
- pw#80
- Ширината на страницата е 80 символа.
- pl#72
- Дължината на страницата е 72 реда.
- px#1440
- Ширината на страницата е 1440 пиксела.
- mx#0
- Неограничен размер на файла за печат.
- af=/var/log/lp-acct
- Счетоводен файл
- lf=/var/log/lp-errs
- Файл за грешки.
Ето и таблицата на опциите във файла /etc/printcap:
Ключ |
Мнемоничен |
Запис в /etc/printcap |
Качество |
Цвят |
Първоначално |
|
|
if |
нормално |
не |
|
-f |
final |
rf |
най-добро |
не |
Fortran |
-d |
draft |
df |
чернова |
не |
DVI (tex) |
-c |
colour |
cf |
нормално |
да |
cifplot |
-g |
good |
gf |
най-добро |
да |
plot(3) |
-t |
test |
tf |
чернова |
да |
troff |
-n |
|
nf |
|
|
ditroff |
-v |
|
vf |
|
|
raster image |
Специални благодарности на Andy Mortimer за въпросната конфигурация.
От
тук можете
да download-нете архив с девет конфигурационни файла,
някои използвани от горния /etc/printcap-файл.
Още един по-семпъл пример
Нека пуснем HP DeskJet 660C. Предполагаме, че принтера е
свързан към /dev/lp1. Добавяме следното в /etc/printcap:
# HP DeskJet 660C
lp|hpdj:\
:lp=/dev/lp1:\
:sd=/var/spool/lpd/hpDeskJet:\
:mx#0:\
:if=/var/spool/lpd/hpDeskJet/filter:\
:lf=/var/spool/lpd/hpDeskJet/errs:\
:sh:
Убедете се, че правата на /etc/printcap са r--r--r-- и
като root изпълнете следните команди
cd /var/spool/lpd
mkdir hpDeskJet
chown root.daemon /var/spool/lpd/hpDeskJet
chmod ug=rwx,o=rx /var/spool/lpd/hpDeskJet
cd hpDeskJet
touch .seq errs status lock
chown root.daemon .seq errs status lock
chmod ug=rw,o=r .seq errs status lock
Създайте следния файл /var/spool/lpd/hpDeskJet/filter
#!/bin/sh
/usr/bin/gs -dSAFER -dNOPAUSE -sPAPERSIZE=a4 \
-sDEVICE=cdj550 -dBitsPerPixel=32 -dShingling=1 -dDepletion=1 \
-sOutputFile=- -q -
И изпълнете следващите команди:
chmod ug=rwx,o=rx filter
Накрая отпечатайте тестова страница с командата
lpr /usr/lib/ghostscript/examples/colorcir.ps
Не е много сложно нали?... :-)