Home    Решения    Услуги    Download    Публикации    Работа    Продукти    Документи
 

 

 
Print this page/Отпечатай тази страница  

 

Печат под Linux

от Йовко Ламбрев ([email protected])



       Когато имате 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

   Не е много сложно нали?... :-)