Printimine

Allikas: Kuutõrvaja


BSD-stiilis printimine

Tavaliselt on UNIXi printimine korraldatud nö BSD-stiilis, mis tähendab, et kasutatakse LPD-d (Line Printer Daemon). LPD-le vastav programmide komplekt on kaasas praktiliselt kõigi levitavate UNIXitega. Et selles veenduda, tuleb teha kindlaks näiteks programmi lpd olemasolu.

Süsteemi käivitamisel alustab teiste seas tööd süsteemi printerideemon lpd, lugedes läbi printerite kirjeldusfaili /etc/printcap ning jääb edasisi korraldusi ootama.

Olgu süsteemis kaks printerit, ps1 ja ps2, mis parasjagu on oma töid saatnud trükki ja muidu printimisega tegelevad mitmed kasutajad. Seda olukorda kirjeldab LPD seisukohast selline skeem

süsteemi 
   lpd 
    |
    |  
     - lpd -  'lpr -P ps2 /home/priit/lilleke.ps' - printeri ps2 sappa töö lisamine 
    |
     - lpd -  'lprm -P ps1 154' - printeri ps1 sabast töö eemaldamine
    |
     - lpd -  /var/spool/lpd/ps1 - printerile ps1 sabast tööde saatmine
    |
     - lpd -  /var/spool/lpd/ps2 - printerile ps2 sabast tööde saatmine

Süsteemi lpd ülesandeks on iga tulnud korraldusega seada tegelema uus lpd ja ise jääda ootama järgnevaid korraldusi.

Antud juhul on ta tekitanud neli lpd'd

   * Ülemine lpd tegeleb töö saatmisega sappa ehk printeri spuuli. Nimelt LPD printimissüsteem töötab selliselt, et kõik trükitavad tööd asetatakse esmalt
     sappa ja trükitakse siis, kui see on süsteemile sobiv. Saba on kataloog, kus printimiseks mõeldud tööd ajutiselt oma järge ootavad.
   * Ülevalt teine lpd tegeleb kasutaja korraldusega eemaldada printeri ps1 sabast töö number 154.
   * Kaks alumist lpd-d tegelevad printimisega, st nad saadavad printeri sabadest töid printeritesse. 

Põhimõtteliselt piisab PostScript faili trükkimiseks PostScript printerile käsust

bash~$ cat lilleke.ps > /dev/lp0

kus /dev/lp0 on printerile vastav seade, kuid seda ei maksa kasutada muidu, kui ainult katsetamiseks.

Tuuma konfigureerimine

Printimiseks kasutatakse tavaliselt arvuti paralleelporti ühendatud printerit, mille tarvis tuleb kernelisse kompilleerida sisse vastav toetus. Tehke sellised valikud, 2.2.xx kerneli ja PC korral

   General Setup ->     Parallel port support
                           PC-style hardware

Character Devices ->     Parallel printer suppor

Peale printeri juhtme ühendamist veenduge, et arvuti BIOSis on printer lubatud ning tema IRQ ja IO ei ole konfliktis teiste seadmete ressurssidega.

Teiseks levinud võimaluseks on kasutada võrguprinterit. Sel juhul pole vaja kernelisse ülaltoodud toetust kompilleerida.

Printerite kirjeldusfail

See fail on lpd konfiguratsioonifail ning selles on defineeritud kõik printerid, mida süsteemi kasutajad saavad kasutada. Igale printerile vastab üks sektsioon, kus näidatakse vastav füüsilise printeri seade. Lisaks saab trükitavate tööde mahtu piirata ning filtrite abil käigult töid erinevatesse formaatidesse teisendada ja printerite kasutust logida.

Lihtsamal juhul, kui te kasutate PostScript printerit ning soovite trükkida PostScript faili, piisab printer kirjeldada näiteks selliselt

# postscript printer

ps1:\
        sd=/var/spool/lpd/ps1:\
        mx#0:\
        sh:\
        lp=/dev/lp0


Printeri kirjeldusfaili süntaksi näeb ette, et parameetrid eraldatakse kooloniga (:) ning nad asuvad ühes reas. Rida saab jätkata kasutades kurakaldu (\) viimase sümbolina real.

Näites kasutatud parameetrite tähendused:

   * ps1 - printeri nimi, mida kasutatakse printeri poole pöördumisel
   * sd - printeri saba kataloog, sellesse paigutatakse printimiseks saadetud tööd oma järge ootama
   * mx#0 - näitab maksimaalse prinditava töö suurust; 0 tähendab, et lubatakse printida kuitahes suuri töid
   * sh - (supress heades) näitab, et mitte trükkida esimest lehte, kus on vaikimisi kirjas info printeri kasutaja ja tema töö kohta
   * lp - printerile vastav füüsiline seade 

Kui printeri kirjeldusfailis defineeritakse mitu printerit, siis eraldatakse vastavad sektsioonid omavahel ühe või mitme reavahetusega. Märgiga # algavaid ja tühje ridu ignoreeritakase.

Printeri filter

Töö formaadi teisendamine

Kui teil on kasutada PostScript printer ning te soovite trükkida näiteks Pine'ist ning kontrollida tulemuse välimust, siis on otstarbekas seada tööle filter, mis teisendab ASCII teksti näiteks programmiga a2ps vastavaks PostScriptiks ning see saadetakse edasi printerile

  1. ascii printer
asc1:\
       sd=/var/spool/lpd/asc1:\
       mx#0:\
       sh:\
       lp=/dev/lp0:\
   	if=/var/spool/lpd/asc1/a2ps-filter

Kusjuures filter on kooriku skript, näiteks seesugune

Scripti tarvitamise idee seisneb selles, et kui kasutaja tarvitab tavalisel moel printerit asc1, näiteks

bash~$ w | lpr -P asc1

siis suunatab lpr talle antud faili filtri sisendisse ja filter suunab omakorda enda väljundi, mis on eeldatavasti juba PostScript printeriseadmes.

Teine tüüpiline teisendus tehakse siis, kui teil on kasutada mitte PostScript printer. Sel juhul peate te kasutama filtrina näiteks programmi GhostScript, mis teisendab PostScript faile talle tuntud printerite keelde, näiteks PCL (Printer Command Language). Omades HP LaserJet 4L printerit, võib kasutada sellist filtrit

#!/bin/sh
cat | gs -q -dSAFER -dNOPAUSE -sPAPERSIZE=a4 -sDEVICE=ljet4 -sOutputFile=- -

Kasutatud GhostScripti võtmed

   * q - ei anna teateid
   * dSAFER - ei luba PostScriptil teha karme asju, näiteks faile kustutada
   * dNOPAUSE - trükib järjest
   * dPAPERSIZE - määrab paberi suuruse
   * sDEVICE - näitab millise printeri keelde teisendatakse
   * sOutputFile - kuhu väljund suunatakse

Printeri saba

Kui kasutaja prindib, siis esmalt paigutatakse prinditavale failile vastav töö tavaliselt kataloogi /var/spool/lpd/prinerinimi alla ning kasutaja ei pea ootama seni, kuni printimine on reaalselt toimunud. Sabas võivad korraga oma järjekorda oodata mitmete kasutajate tööd. Saba kataloog peab olema vaid juurkasutajale kirjutatav.

Programmiga lpq saab uurida, mis sabas toimub. Näiteks vaadata printeri ps1 saba

bash~$ lpq -P ps1

Sabast saab töid eemaldada käsuga lprm. Näiteks soovides eemaldada printeri ps1 sabast 24-dat tööd

bash~$ lprm -P ps1 24

lpd deemoni juhtprogramm lpc

Teatud juhtudel on vaja reaalse printeri töö lõpetada, näiteks tahma vahetamiseks, kuid arusaadavalt peavad kasutajad saama endiselt oma töid printida. LPD hoiab neid lihstalt seni sabas, kui printer taas töötada suudab.

lpc kontrollib lpd deemonite tööd, kusjuures kirjeldatud olukorda on võimalik luua selliselt:

bash~$ lpc stop ps1

Kui lpc käivitada ilma argumentideta, siis läheb ta tööle interaktiivses režiimis.

Administraatori jaoks on oluline reguleerida seoses printimisega kahte asja

   * töid saadetakse sabast printerile, st printeri deemon töötab
   * kasutajalt tulevad tööd asetatakse printeri sappa 

Selgitame oluliste lpc käskude tähendust, mis reguleerivad nimetatud kahte asja, käsu süntaks on järgmine

lpc käsk printerinimi

käsud:

   * status - saab vaadata printerinimelise printeri seisu, näiteks
     bash# lpc status ps1
     ps1:
             queuing is enabled
             printing is enabled
             7 entries in spool area
             ps1 is ready and printing
     Antud juhul on näha, et printer ps1 parasjagu trükib, kusjuures sabas ootavad 7 tööd. Peale selle on lubatud sappa tööde lisamine ning loomulikult
     printimine.
   * stop - peatada printimine, vajadusel oodatakse kuni käesolev töö lõpeb. Peatatud printeri sappa saab töid edasi saata,st printeri deemoni lõpetamist
   * start - peatatud printeri käivitamine, st printeri deemoni käivitamine
   * disable - keelatakse tööde lisamine printeri sappa. Sabas olevate tööde printimine jätkub, st printeri deemon jätkab tegevust
   * enable - keelatud sabasse saab taas töid lisada
   * down - keelatakse sappa tööde lisamine ja lõpetatakse printeri deemon, sama mis disable ja stop
   * up - lubatakse taas printida, st käivitatakse printeri deemon, ja töid sappa asetada
   * topq - tõstab sabas oleva töö järjekorras esimeseks, näiteks seame printeri ps sabas oleva töö nr 154 esimeseks 'lpc topq ps 154'
   * abort - katkestab töö printimise, kuid sappa saab töid lisada
   * restart - taaskäivitab printeri deemoni juhul, kui see arusaamatutel põhjustel otsa lõppes

Võrgu printerile printimine

Soovides lubada masina printerit kasutada teise masina kasutajatel, tuleb tekitada näiteks seesugune /etc/hosts.lpd fail

printerless.zoo.tartu.ee

Kusjuures masina printerless printerite kirjeldusfailis tuleb kirjeldada üle võrgu kasutatav printer, näiteks selliselt

rps:\
      sd=/var/spool/lpd/rp:\
      rm=printeriga.zoo.tartu.ee:\
      rp=ps1:\
      lp=/dev/null:\
      sh:

Kui masina printerless kasutajad prindivad printerile rps, siis saadetakse töö edasi üle võrgu masina printeriga.zoo.tartu.ee printerile nimega ps1.

Võrguprinterile printimine

Poodides jagatakse selliseid etherneti külge ühendatavaid karbikesi, millele saab omistada IP-aadressi ja mis põhiline, mille külge saab ühendada printeri. Selliselt tööle seatud printerit nimetatakse võrgupirnteriks.

np:\
           lp=/dev/null:\
           sh:\
           sd=/var/spool/lpd/np:\
           rm=192.168.1.15:\
	    rp=raw:

Virtuaalne printer

Kui masinal tegelikult pole printerit, aga mingil põhjusel vajab programm selle olemasolu või soovite lihtsalt katsetada, siis võimaldab LPD luua virtuaalse printeri. Nii korraldatud juhul toimub trükkimine, kuid töö salvestatakse näiteks faili.

Tekitame virtuaalse printeri nimega vp ja seame ta käima nii, et prinditud töö kirjutatakse faili /tmp/vp.ps. Iga uus kirjutab eelmise üle. Lisaks saab kasutades programmi GhostView tulemust ekraanil vaadata.

vp:\
       sd=/var/spool/lpd/vp:\
       mx#0:\
       sh:\
       lp=/dev/null:\
       if=/var/spool/lpd/vs/vp.file:

kus filter vs.file on selline

#!/bin/sh
sleep 6
cat > /tmp/vp.ps

Tukkeaeg 6 sekundit on selleks, et katsetamisel näha, kuidas deemonid tulevad ja lähevad.