Hoofdstuk 10. Printers

Inhoudsopgave

10.1. De printer daemon aanzetten
10.2. /etc/printcap configureren
10.3. Ghostscript Configureren
10.4. Printerbeheer commando's
10.5. Op afstand afdrukken

De hoofdstuk beschrijft een simpele printerconfiguratie, als voorbeeld wordt een HP Deskjet 690C gebruikt die verbonden is aan de eerste parallele poort. Eerst zal het systeem geconfigureerd worden om tekstdocumenten te printen en daarna zal de configuratie uitgebreid worden voor het printen van postscript documenten met behulp van het ghostscript programma.

10.1. De printer daemon aanzetten

Na de installatie is het nog niet mogelijk te printen, omdat de lpd printer spooler daemon nog niet gestart is. Om lpd tijdens het starten te laden moet de volgende regel in /etc/rc.conf:

lpd=NO

veranderd worden in:

lpd=YES

Deze verandering wordt actief bij het herstarten van het systeem, maar de daemon kan nu handmatig gestart worden met:

# lpd -s

Voer het volgende commando uit om te controleren of lpd aktief is:

# ps ax | grep lpd
  179 ??  Is     0:00.01 lpd 

Als u geen lpd ziet in de uitvoer van het vorige commando, is de daemon niet aktief.

Voor het configureren van /etc/printcap is het verstandig eerst een printertest uit te voeren om te controleren of de connectie werkt. Bijvoorbeeld:

# lptest 20 10 > /dev/lpt0

Om te zien hoe de uitvoer er uit moet zien kunt u het commando uitvoeren zonder de uitvoer te omleiden naar de printer:

# lptest 20 10

Een veel voorkomend probleem is dat de uitvoer van de printer niet correct uitgelijnd is in kolommen, maar het de vorm heeft van een “trap”. Dit betekent gewoonlijk dat uw printer ingesteld is om een nieuwe regel te beginnen bij de linkermarge nadat het zowel een <CR> (carriage return, ASCII 13) als een <LF> (line feed, ASCII 10) karakter ontvangen heeft. NetBSD stuurt alleen een <LF> karakter. U kunt dit probleem oplossen door:

  • de configuratie van de printer aan te passen

  • een simpele printer filter te gebruiken (wordt later beschreven)

Opmerking

in het vorige voorbeeld is de lpd spooler niet betrokken, omdat de programma-uitvoer rechtstreeks naar de printer device is gestuurd (/dev/lpt0) en niet <spooled> is.

10.2. /etc/printcap configureren

Deze sectie beschrijft hoe de voorbeeldprinter zodanig geconfigureerd kan worden dat het tekstdocumenten afdrukt.

De printer moet geconfigureerd zijn in het /etc/printcap bestand; de configuratie bestaat uit een printer id (de naam van de printer) en een beschrijving voor de printer. De ld id wordt standaard door veel programma's gebruikt.

Voorbeeld 10.1. /etc/printcap

lp|local printer|HP DeskJet 690C:\
        :lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:\
        :sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:

Het formaat en de opties worden gedetailleerd beschreven in printcap(5). Let op dat er een invoer filter gespecificeerd is (met de if optie) die zorgt dat het "trap probleem" opgelost wordt:

if=/usr/local/libexec/lpfilter

Printer driver en HP printers

Voorbeeld 10.1, “/etc/printcap gebruikt de lpa# device (polled driver) voor de printer, in plaats van de lpd# (door een interrupt aangedreven driver). Het gebruikt van interrupts kan problemen opleveren met sommige printers, waaronder de HP Deskjet 690C: afdukken gaat erg langzaam en het afdrukken van een postscript kan uren duren. Dit probleem is op te lossen door de lpa driver te gebruiken. Het is ook mogelijk een kernel te compileren waarin lpd "gepolled" wordt.

De configuratie in printcap specifiseert ook een spool directory, die aangemaakt moet worden; deze directory zal door de lpd daemon gebruikt worden om de data op te slaan die afgedrukt gaat worden.

# cd /var/spool/lpd
# mkdir lp
# chown daemon:daemon lp
# chmod 770 lp

Het enige deel dat nog mist is de lpfilter invoer filter, die geschreven moet worden. De enige taak die door deze filter uitgevoerd wordt is de printer zodanig te configureren dat het "trapprobleem" opgelost is voordat de tekst die afgedrukt moet worden naar de printer gestuurd wordt. De printer die in dit voorbeeld gebruikt wordt vereist een initialisatiereeks: “ESC &k2G”.

Voorbeeld 10.2. /usr/local/libexec/lpfilter

#!/bin/sh
# Treat LF as CR+LF
printf "\033&k2G" && cat && exit 0
exit 2
# cd /usr/local/libexec
# chmod 755 lpfilter*

Opmerking

er is een andere filter die gebruikt kan worden:

\:if=/usr/libexec/lpr/lpf:

Deze filter is veel complexer dan de filter die hiervoor is geïntroduceerd. Het is geschreven om de uitvoer van nroff te verwerken en kan omgaan met onderstreping, breidt tab karakters uit en converteert LF naar CR + LF. De broncode van deze filter kan gevonden worden in /usr/src/usr.sbin/lpr/filters/lpf.c.

Het lptest commando kan nu opnieuw gestart worden, deze keer met het gebruik van de lpd spooler:

# lptest 20 10 | lpr -h

Het lpr programma maakt gebruik van de spooler om data naar de printer te sturen; de -h optie schakelt het printen van een banner pagina uit (dit is niet noodzakelijk vanwege de sh optie in /etc/printcap).

U kunt het "trapprobleem" met een verschillende gereedschappen en methodes oplossen, bijvoorbeeld met behulp van C programma's. De oplossing die getoond is heeft het voordeel dat het erg simpel is.

10.3. Ghostscript Configureren

Nu het afdrukken van eenvoudige teksten werkt, zal de functionaliteit voor het afdrukken van PostScript bestanden toegevoegd worden. De simpele printer die in dit voorbeeld gebruikt wordt kan niet rechtstreeks PostScript bestanden afdrukken; er dient een programma gebruikt te worden die een PostScript document converteert naar een reeks van commando's die de printer begrijpt. Het Ghostscript programma, uit de package collectie, kan voor dit doel gebruikt worden . In deze sectie wordt uitgelegd hoe u Ghostscript kunt configureren voor het afdrukken van PostScript bestanden op een HP Deskjet 690C.

Er zal een tweede id gebruikt worden in /etc/printcap: deze nieuwe id zal een andere invoerfilter gebruiken, deze zal Ghostscript genoemd worden en het afdrukken van een PostScript document afhandelen. Daarom zullen tekstdocumenten afgedrukt worden op de lp printer en PostScript documenten op de ps printer: beide configuraties gebruiken dezelfde fysieke printer, maar gebruiken verschillende filters.

Hetzelfde resultaat kan bereikt worden met een andere configuratie. Er kan bijvoorbeeld één configuratie gebruikt worden met één filter, de filter moet in staat zijn te determineren wat het formaat is van het document dat afgedrukt wordt. Deze benadering leidt tot een complexere filter; als deze benadering u aanspreekt kunt u overwegen het magicfilter programma uit de package collectie te gebruiken: het heeft deze functionaliteit en kan veel andere dingen automatisch doen.

Het nieuwe /etc/printcap kan er als volgt uitzien:

Voorbeeld 10.3. /etc/printcap

lp|local printer|HP DeskJet 690C:\
        :lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:\
        :sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:

ps|Ghostscript driver:\
        :lp=/dev/lpa0:sd=/var/spool/lpd/ps:lf=/var/log/lpd-errs:\
        :mx#0:sh:if=/usr/local/libexec/lpfilter-ps:

Optie mx#0 is erg belangrijk voor het afdrukken van Postscript bestanden, omdat het grootterestricties op af te drukken bestanden elimineert; PostScript bestanden zijn vaak erg groot. De if verwijst naar de nieuwe filter. Er is ook een nieuwe spool directory.

De laatste stap is het aanmaken van een nieuwe spool directory en het filterprogramma.

# cd /var/spool/lpd
# mkdir ps
# chown daemon:daemon ps
# chmod 770 ps

De filter voor PostScript uitvoer is complexer dan de tekstfilter: het bestand dat afgedrukt moet worden moet doorgevoerd worden aan GhostScript, die op zijn beurt een reeks van commando's in de printertaal naar de printer stuurt. We hebben het nu gepresteerd een goedkope kleurenprinter om te zetten in een apparaat dat geschikt is voor PostScript uitvoer, dankzij het NetBSD besturingssysteem en een aantal krachtige vrije software programma's. De opties die gebruikt worden om Ghostscript te configureren zijn beschreven in de Ghostscript documentatie: cdj550 is het apparaattype dat gebruikt wordt om de HP printer aan te sturen.

Voorbeeld 10.4. /usr/local/libexec/lpfilter-ps

#!/bin/sh
# Treat LF as CR+LF
printf "\033&k2G" || exit 2
# Print the postscript file
/usr/pkg/bin/gs -dSAFER -dBATCH -dQUIET -dNOPAUSE -q -sDEVICE=cdj550 \
-sOutputFile=- -sPAPERSIZE=a4 - && exit 0
exit 2

Samenvattend zijn er twee verschillende printernamen aangemaakt op het systeem, die beide verwijzen naar dezelfde fysieke printer, maar verschillende opties, verschillende filters en verschillende spool directories gebruiken. Er kunnen nu tekst- en PostScript bestanden afgedrukt worden. Om PostScript bestanden te printen moet de Ghostscript package geïnstalleerd zijn.

10.4. Printerbeheer commando's

Deze sectie toont een aantal nuttige BSD commando's voor het administreren van printers en afdrukopdrachten. Naast het reeds genoemde lpr commando en lpd zijn er:

lpq

toont de rij van afdrukopdrachten.

lprm

verwijdert opdrachten uit de printer rij.

lpc

controleert het afdruksysteem, schakelt printers en printermogelijkheden aan en uit.

10.5. Op afstand afdrukken

Het is mogelijk het afdruksysteem zodanig te configureren dat er afgedrukt kan worden op een printer die verbonden is aan een andere host. Laten we zeggen dat u, bijvoorbeeld, op de wotan host werkt en u wilt afdrukken op een printer die verbonden is met de loge host. Het /etc/printcap bestand van loge is gelijk aan Voorbeeld 10.3, “/etc/printcap. Het wordt mogelijk vanaf wotan PostScript bestanden te printen met behulp van de Ghostscript op loge.

De eerste stap is te zorgen dat loge afdrukopdrachten van de wotan host accepteert. Hiertoe moet eerst een regel met wotan's hostnaam toegevoegd worden aan het /etc/hosts.lpd bestand op loge. Het formaat van dit bestand is erg simpel: elke regel bevat de naam van een host die toegang tot de printer mag hebben. Standaard luistert de daemon alleen maar op UNIX domain sockets. Om te zorgen dat de daemon ook inkomend netwerkverkeer accepteert moet aan /etc/rc.conf het volgende worden toegevoegd:

lpd_flags=""

Vervolgens moet het /etc/printcap bestand op wotan geconfigureerd worden zodat het afdrukopdrachten naar loge stuurt. Bijvoorbeeld:

lp|line printer on loge:\
	:lp=:sd=/var/spool/lpd/lp:lf=/var/log/lp-errs:\
	:rm=loge:rp=lp

ps|Ghostscript driver on loge:\
	:lp=:sd=/var/spool/lpd/lp:lf=/var/log/lp-errs:\
	:mx#0:\
	:rm=loge:rp=ps

Er zijn vier fundamentele verschillen tussen deze configuratie en die van Voorbeeld 10.3, “/etc/printcap:

  1. De definitie van “lp” is leeg.

  2. De “rm” optie definieert de naam van de host waaraan de printer verbonden is.

  3. De “rp” optie definieert de naam van de printer die verbonden is met de andere host.

  4. Het is niet noodzakelijk invoerfilters te specificeren, omdat de definities op de loge host gebruikt zullen worden.

Nu zullen de afdrukopdrachten voor “lp” en “ps” op wotan automatisch naar de printer die aan loge verbonden is gestuurd worden.