Deze sectie behandelt het gebruik van filters om speciaal opgemaakte tekst en voorbladen af te drukken, via het netwerk af te drukken en printergebruik te beperken en statistieken bij te houden.
Hoewel LPD veel van het afdrukwerk afhandelt (netwerkverkeer, wachtrijafhandeling, toegangscontrole, enzovoort), wordt het echte werk door de filters gedaan. Filters zijn programma's die met een printer communiceren en inspelen op printerspecifieke eigenschappen. In de eenvoudige printeropzet is een filter geïnstalleerd voor platte tekst, een zeer eenvoudig filter dat met de meeste printers zou moeten werken (Tekstfilter installeren).
Om echter gebruik te maken van formaatomzetting, printeradministratie, printerspecifieke aanpassingen, enzovoort, is het nodig te weten hoe filters werken. Uiteindelijk is het de verantwoordelijkheid van het filter om deze zaken af te handelen. Het slechte nieuws is dat de beheerder in het merendeel van de gevallen het filter moet aanleveren. Het goede nieuws is dat veel filters algemeen beschikbaar zijn en als ze dat niet zijn, zijn ze vaak makkelijk te schrijven.
FreeBSD heeft een ingebouwd filter,
/usr/libexec/lpr/lpf
, die met veel
printers werkt die platte tekst kunnen afdrukken. Het filter
regelt backspace en tabs in bestanden en administreert
printergebruik, maar dat is zo'n beetje alles wat dit filter
doet. Er zijn ook diverse filters en filtercomponenten in de
FreeBSD Portscollectie.
Hieronder wordt het volgende beschreven:
In Hoe filters werken staat een overzicht van de rol die een filter speelt in het afdrukproces. Lees dat onderdeel om een indruk te krijgen wat er “onder de motorkap” gebeurt als LPD filters gebruikt. Deze kennis helpt mogelijke problemen te voorkomen of op te lossen als meerdere filters worden geïnstalleerd voor printers.
LPD gaat er van uit dat elke printer standaard platte tekst af kan drukken. Dit geeft problemen voor PostScript® (of andere op taal gebaseerde) printers die niet in staat zijn direct platte tekst af te drukken. In Platte tekst op PostScript®-printers afdrukken staat wat er kan worden gedaan om dit probleem te verhelpen. Lees verder in dit onderdeel als het om PostScript®-printers gaat.
Voor veel programma's is PostScript® een populair uitvoerformaat. Sommige mensen schrijven PostScript® code zelfs direct. PostScript®-printers zijn echter kostbaar. In PostScript® simuleren op niet-PostScript®-printers staat hoe de tekstfilter van een printer aangepast moet worden zodat die PostScript® accepteert en afdrukt op een niet-PostScript®-printer. Dit onderdeel is van toepassing voor niet-PostScript®-printers.
In Conversiefilters
wordt een methode beschreven om de conversie van bepaalde
bestandsformaten te automatiseren, zoals van grafische of
tekstopmaakprogramma's, naar formaten die een printer kan
begrijpen. Na het lezen van dit onderdeel is een beheerder
in staat om een printer zodanig in te stellen dat
gebruikers lpr
kunnen
invoeren om troff-gegevens af te drukken, -t
lpr
om TeX DVI-gegevens af te
drukken of -d
lpr
om
rasterplaatjes af te drukken, enzovoorts. Het wordt
aangeraden deze sectie te lezen.-v
In Uitvoerfilters wordt een niet vaak gebruikte functionaliteit van LPD behandeld: uitvoerfilters. Tenzij voorbladen worden afgedrukt (Voorbladen), kan deze sectie waarschijnlijk overgeslagen worden.
lpf: een
tekstfilter beschrijft lpf
, een
redelijk complete, eenvoudige tekstfilter voor lijnprinters
(en laserprinters die zich als lijnprinters voordoen) dat
wordt geleverd bij FreeBSD. Voor een snelle manier om
printeradministratie aan de praat te krijgen voor platte
tekst of voor printers waar rook uit komt bij het zien van
backspace karakters, is het serieus te overwegen gebruik te
maken van lpf
.
Een kopie van de scripts die hieronder worden beschreven,
staan in de map /usr/share/examples/printing
.
Zoals eerder genoemd, is een filter een programma dat wordt uitgevoerd door LPD voor het afhandelen van het apparaatafhankelijke deel van de communicatie met een printer.
Als LPD een bestand wil
afdrukken uit een afdrukopdracht, start het een
filterprogramma. Het koppelt de standaard invoer van de
filter aan het af te drukken bestand, de standaard uitvoer
aan de printer en de standaard foutmelding aan het
logboekbestand voor foutmeldingen (zoals opgegeven via de
optie lf
in
/etc/printcap
of standaard
/dev/console
).
Welk filter LPD start en de
argumenten van het filter hangen af van wat er in het bestand
/etc/printcap
wordt opgegeven en de
argumenten die de gebruiker geeft op de commandoregel van
lpr(1). Als een gebruiker bijvoorbeeld
lpr
ingeeft, start
LPD het filter troff, zoals wordt
opgegeven via de optie -t
tf
voor de
betreffende printer. Als een gebruiker platte tekst wilt
afdrukken, dan wordt het filter if
gestart
(dit klopt bijna: zie Uitvoerfilters voor
de details).
Er zijn drie soorten filters die in
/etc/printcap
kunnen worden
opgegeven:
Het tekstfilter, dat in de LPD documentatie verwarrend genoeg input filter wordt genoemd, verwerkt het afdrukken van gewone tekst. Beschouw het als het standaardfilter. LPD verwacht dat elke printer standaard platte tekst kan afdrukken en het is de taak van het tekstfilter om er voor te zorgen dat backspaces, tabs en andere speciale karakters de printer niet in de war sturen. In een omgeving waar moet worden bijgehouden hoeveel er wordt afgedrukt, moet het tekstfilter ook administreren hoeveel pagina's er zijn afgedrukt. Dit gaat meestal door het aantal afgedrukte regels te tellen en dit te vergelijken met het aantal regels per pagina dat door de printer wordt ondersteund. Het tekstfilter wordt aangeroepen met de volgende lijst argumenten:
filter-name
[-c] -w width
-l length
-i indent
-n login
-h host
acct-file
met
-c
wordt gebruikt als de afdrukopdracht is gegeven
met lpr
-l
width
is de waarde van de optie pw
(page width: paginabreedte),
zoals opgegeven
in /etc/printcap
, standaard
132
length
is de waarde van de optie pl
(page length: paginalengte),
standaard 66
indent
geeft aan hoeveel wordt ingesprongen door
lpr
,
standaard 0-i
login
de gebruikersnaam van de gebruiker die de afdrukopdracht gaf
host
de hostnaam waar de afdrukopdracht gegeven is
acct-file
de naam van het administratiebestand zoals
opgegeven via de optie af
.
Een conversiefilter converteert een specifiek bestandsformaat naar een formaat dat een printer begrijpt. Bijvoorbeeld: ditroff typesettinggegevens kunnen niet direct worden afgedrukt, maar er bestaat wel een conversiefilter om ditroff-gegevens te converteren naar een formaat dat een printer kan verteren en afdrukken. Dit wordt in Conversiefilters beschreven. Conversiefilters zijn ook nodig om printergebruik te administreren, mocht dat nodig zijn. Conversiefilters worden met de volgende argumenten aangeroepen:
filter-name
-x
pixel-width
-y
pixel-height
-n login
-h host
acct-file
Hier is pixel-width
de
waarde van de optie px
(standaard 0)
en pixel-height
is de waarde
van de optie py
(standaard 0).
Het uitvoerfilter wordt alleen gebruikt als er geen tekstfilter is of als er voorbladen worden afgedrukt. De ervaring leert dat uitvoerfilters zelden worden gebruikt. In sectie Uitvoerfilters worden ze beschreven. Er zijn slechts twee argumenten die aan een uitvoerfilter worden meegegeven:
filter-name
-w width
-l length
Deze zijn identiek aan de argumenten
-w
en -l
van het
tekstfilter.
Filters moeten afsluiten met de volgende waarde:
Als het filter een bestand succesvol heeft afgedrukt.
Als het filter niet geslaagd is om een bestand af te drukken, maar wil dat LPD het nogmaals probeert. LPD herstart het filter als die afsluit met deze status.
Als het filter niet geslaagd is om een bestand af te drukken, maar niet wil dat LPD het nogmaals probeert. LPD verwijdert het bestand uit de wachtrij.
Het tekstfilter dat bij FreeBSD wordt geleverd,
/usr/libexec/lpr/lpf
, benut de
argumenten voor paginabreedte en -lengte om te bepalen
wanneer een nieuwe pagina moet worden begonnen en om het
printergebruik bij te houden. Het gebruikt de argumenten
voor login, host en administratiebestand om accountingregels
aan te maken.
Controleer bij het zoeken naar filters of ze LPD-compatibel zijn. Zo ja, dan ondersteunen ze de argumenten zoals hierboven beschreven. Zorg bij het zelf schrijven van filters voor algemeen gebruik dat ze dezelfde argumenten en exitcodes ondersteunen.
Als een computer en PostScript® (of andere op taal gebaseerde) printer maar één gebruiker hebben die belooft nooit platte tekst naar de printer te sturen of programma's te gebruiken die dat doen, dan is dit onderdeel overbodig.
Als gebruikers zowel PostScript® als platte tekst
naar een printer willen sturen, dan is het aan te raden de
printerinstellingen hierop aan te passen. Hiervoor moet het
tekstfilter bij elke nieuwe opdracht bepalen of het om platte
tekst of PostScript® gaat. Alle PostScript®-opdrachten
beginnen met %!
(raadpleeg de
printerhandleiding voor andere printertalen). Als dit de
eerste twee karakters zijn van een opdracht is het
PostScript® en kan de rest van een opdracht direct
doorgestuurd worden. Is dit niet het geval, dan moet de
filter de tekst omzetten in PostScript® en het resultaat
afdrukken.
Hoe gaat dat werken?
Voor seriële printers kan het meest eenvoudig
lprps
geïnstalleerd worden.
lprps
is een PostScript®-afdrukfilter
die tweewegcommunicatie met een printer heeft. Het werkt
het statusbestand van een printer bij met uitgebreide
informatie afkomstig van een printer, zodat gebruikers en
beheerders precies kunnen zien wat de status van een printer
is (zoals: toner bijna op of
papier vastgelopen). Maar
belangrijker, het omvat het programma psif
dat bepaalt of een binnenkomende opdracht platte tekst is en
textps
(dat ook geleverd wordt met
lprps
) om opdrachten om te zetten naar
PostScript®. Vervolgens wordt een opdracht met
lprps
naar een printer gestuurd.
lprps
is onderdeel van de FreeBSD
Portscollectie (zie De
Portscollectie). U kunt één van de
ports print/lprps-a4
of
print-lprps-letter
installeren afhankelijk van de gebruikte papiermaat. Nadat
lprps
is geïnstalleerd moet de
installatielocatie ervan aan psif
worden
doorgeven dat onderdeel is van lprps
. Als
lprps
is geïnstalleerd via de
Portscollectie, gebruik dan het volgende voor de seriële
PostScript®-printer in /etc/printcap
:
/usr/local/libexec/psif
:Ook moet de optie rw
worden opgeven,
die LPD vertelt om een printer in
lezen/schrijvenmodus te openen.
Als een parallelle PostScript®-printer wordt ingesteld
(en dus geen tweewegcommunicatie toegepast kan worden met de
printer, zoals vereist door lprps
), dan
kan het volgende shellscript gebruikt worden als
tekstfilter:
In bovenstaand script is textps
een
programma dat geïnstalleerd is om platte tekst om te
zetten naar PostScript®. Elk tekst-naar-PostScript®
programma volstaat. De FreeBSD Portscollectie (zie De Portscollectie) bevat een
uitgebreid tekst-naar-PostScript®-programma,
a2ps
, dat wellicht handig is om te
gebruiken.
PostScript® is de facto de standaard voor op hoge kwaliteit typesetten en afdrukken. PostScript® is echter een dure standaard. Gelukkig heeft Aladdin Enterprises een gratis PostScript®-kloon, Ghostscript, die werkt onder FreeBSD. Ghostscript kan de meeste PostScript®-bestanden lezen en de pagina's op verschillende soorten apparaten weergeven, waaronder veel niet-PostScript®-printers. Door Ghostscript te installeren en een printer gebruik te laten maken van een speciaal tekstfilter voor uw printer, kan uw niet-PostScript®-printer zich gedragen als een echte PostScript®-printer.
Ghostscript is beschikbaar via de FreeBSD Portscollectie,
vele versies zijn beschikbaar, de meest gebruikte versie is
print/ghostscript-gpl
.
Om PostScript® te simuleren moet een tekstfilter detecteren of het een PostScript®-bestand aan het afdrukken is. Zo niet, dan stuurt het filter het bestand direct naar een printer, anders gebruikt het filter Ghostscript om het bestand om te zetten naar een formaat dat door een printer wordt begrepen.
Een voorbeeld: het volgende script is een tekstfilter
voor Hewlett Packard DeskJet 500 printers. Voor andere
printers moet het argument -sDEVICE
voor het
commando gs
(Ghostscript) vervangen worden.
(Met gs -h
wordt een lijst met apparaten
getoond worden die de huidige installatie van
Ghostscript ondersteunt.)
Tot slot moet LPD op de hoogte
gebracht worden van het filter via de optie
if
:
/usr/local/libexec/ifhp
:Dat is alles. Nu kan lpr
en platte.tekst
lpr
ingevoerd worden en beiden worden juist afgedrukt.watdanook.ps
Na de eenvoudige installatie, zoals beschreven in Eenvoudige printerinstallatie, te hebben voltooid, is het waarschijnlijk wenselijk om conversiefilters te installeren voor favoriete bestandsformaten (naast platte ASCII-tekst).
Conversiefilters maken het afdrukken van verschillende bestanden eenvoudig. Stel dat veel gebruik gemaakt wordt van het tekstverwerkingsprogramma TeX en een PostScript® printer. Elke keer als door TeX een DVI-bestand wordt gegenereerd, kan dat niet direct afgedrukt worden. Het DVI-bestand moet omgezet worden naar PostScript®. De te geven opdrachten zijn de volgende:
%
dvips zeewieranalyse.dvi
%
lpr zeewieranalyse.ps
Na installatie van een conversiefilter voor DVI-bestanden kan deze handmatige conversie overgeslagen worden door LPD de conversie te laten uitvoeren. Elke keer als een DVI-bestand wordt afgedrukt, hoeft alleen de volgende opdracht gegeven te worden:
%
lpr -d
zeewieranalyse.dvi
LPD voert de
DVI-bestandsconversie uit door -d
te
geven. In Opties voor opmaak
en conversie staat een lijst van
conversie-opties.
Voor elke conversie-optie moet een
conversiefilter geïnstalleerd
worden en moet in /etc/printcap
de
locatie worden opgegeven. Een conversiefilter is als het
tekstfilter voor de eenvoudige printerinstallatie (Tekstfilter
installeren), behalve dat in plaats van platte
tekst af te drukken, het conversiefilter het bestand
converteert naar een formaat dat een printer
begrijpt.
Installeer de conversiefilters die nodig zijn. Als veel DVI-bestanden worden afgedrukt, dan is het handig een DVI-filter te installeren. Als veel troff wordt afgedrukt, dan is het waarschijnlijk handig een troff-filter te installeren.
De volgende tabel geeft een samenvatting van filters
waarmee LPD kan werken, hoe ze
in /etc/printcap
kunnen worden
aangeroepen en hoe ze met lpr
kunnen
worden aangeroepen:
Bestandsformaat | /etc/printcap
optie | lpr optie |
---|---|---|
cifplot | cf | -c |
DVI | df | -d |
plot | gf | -g |
ditroff | nf | -n |
FORTRAN-tekst | rf | -f |
troff | tf | -f |
raster | vf | -v |
platte tekst | if | geen, -p , of
-l |
In het voorbeeld waarbij lpr
wordt gebruikt, moet voor de
printer een optie -d
df
gedefinieerd staan
in /etc/printcap
.
Ondanks wat anderen mogelijk beweren, zijn formaten als
FORTRAN-tekst en plot waarschijnlijk verouderd. Dit biedt
de mogelijkheid een nieuwe betekenis te geven aan deze
opties door zelf een filter te installeren. Stel dat direct
Printerleaf-bestanden afgedrukt moeten worden (bestanden van
het bureaubladpublicatieprogramma Interleaf), maar nooit
plotbestanden worden afgedrukt. Dan kan een
Printerleaf-conversiefilter geïnstalleerd worden onder
de optie gf
en gebruikers kunnen
geïnstrueerd worden om lpr
te gebruiken om Printerleaf-bestanden af te
drukken.-g
Aangezien conversiefilters programma's zijn die niet
onder de FreeBSD-basisinstallatie vallen, kunnen ze het best
onder /usr/local
geplaatst worden. De map /usr/local/libexec
is een
veelgebruikte locatie, omdat hier programma's te vinden zijn
die alleen door LPD gebruikt
worden. Gewone gebruikers hoeven ze nooit te gebruiken.
Om een conversiefilter te activeren, moet de
bestandslocatie onder de juiste optie voor de betreffende
printer in /etc/printcap
opgegeven
worden.
In het onderstaande voorbeeld wordt het
DVI-conversiefilter toegevoegd onder de sectie van de
printer bamboo
. Hieronder staat opnieuw
het voorbeeldbestand /etc/printcap
, nu
met de nieuwe optie df
voor de printer
bamboo
:
/var/spool/lpd/rattan
:\
:lp=/dev/lpt0
:\
:if=/usr/local/libexec/if-simple
:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo
:\
:lp=/dev/ttyu5
:ms#-parenb cs8 clocal crtscts:rw:\
:if=/usr/local/libexec/psif
:\
:df=/usr/local/libexec/psdf
:Het DVI-filter is een shellscript met de naam
/usr/local/libexec/psdf
. Het script
ziet er als volgt uit:
Dit script roept dvips
in
filtermodus aan (het -f
argument) op de
standaard uitvoer, de af te drukken opdracht. Vervolgens
start het PostScript® afdrukfilter
lprps
(zie Platte tekst op
PostScript®-printers afdrukken) met de argumenten
die LPD aan het script
doorgeeft. lprps
gebruikt deze
argumenten om de afgedrukte pagina's te
administreren.
Er is geen vaste procedure om conversiefilters te installeren, er worden in deze sectie wat werkende voorbeelden gegeven. Gebruik deze als hulp bij het zelf maken van filters. Gebruik ze zonder aanpassingen indien mogelijk.
Dit voorbeeldscript is een raster (eigenlijk een GIF-bestand) conversiefilter voor een HP LaserJet III-Si printer:
Het script converteert achtereenvolgens het GIF-bestand naar een PNM-bestand (portable anymap), een PGM-bestand (portable graymap), een PBM-bestand (portable bitmap) en tenslotte naar LaserJet/PCL formaat.
Een /etc/printcap
bestand dat
bovenstaand filter gebruikt ziet er als volgt uit:
/dev/lpt0
:sh:sd=/var/spool/lpd/teak
:mx#0:\
:if=/usr/local/libexec/hpif
:\
:vf=/usr/local/libexec/hpvf
:Het volgende script is een conversiefilter voor
troff-gegevens afkomstig van het groff-typesettingsysteem
voor de PostScript®-printer bamboo
:
Bovenstaande script maakt eveneens gebruik van
lprps
om de communicatie met een printer
af te handelen. Als een printer op een parallelle poort
is aangesloten, ziet het er als volgt uit:
Dat is alles. In /etc/printcap
moet het volgende toegevoegd worden om het filter
beschikbaar te maken:
/usr/local/libexec/pstf
:Hieronder een voorbeeld waarvan FORTRAN-programmeurs
waarschijnlijk tranen in hun ogen krijgen: een
FORTRAN-tekstfilter voor een willekeurige printer die in
staat is platte tekst af te drukken. Het filter wordt
actief gemaakt voor teak
:
De onderstaande regel wordt toegevoegd aan
/etc/printcap
voor de printer
teak
om het filter beschikbaar te
maken:
/usr/local/libexec/hprf
:Het laatste voorbeeld is wellicht complexer. Er
wordt een DVI-filter toegevoegd voor de eerder genoemde
LaserJet printer teak
. Eerst het
makkelijke gedeelte: in /etc/printcap
wordt de locatie van het DVI-filter opgegeven:
/usr/local/libexec/hpdf
:Nu het moeilijke gedeelte: het schrijven van het filter.
Daarvoor is een DVI-naar-LaserJet/PCL conversieprogramma
nodig. De FreeBSD Portscollectie (zie Portscollectie) heeft er een:
print/dvi2xx
. Door deze
port te installeren komt het programma dat nodig is
beschikbaar, dvilj2p
, waarmee DVI
geconverteerd kan worden naar LaserJet IIp-, LaserJet III-
en LaserJet 2000-formaten.
Het hulpprogramma dvilj2p
maakt het
filter hpdf
redelijk complex, omdat
dvilj2p
niet van de standaard invoer kan
lezen. Het wil werken met een bestandsnaam. Nog lastiger
is dat de bestandsnaam moet eindigen op
.dvi
, zodat moeilijk gebruik
gemaakt kan worden van /dev/fd/0
als standaard.
Dit probleem kan omzeild worden door een (symbolische)
koppeling aan te maken van een tijdelijk bestand (eindigend
op .dvi
) naar /dev/fd/0
. Hiermee wordt
dvilj2p
gedwongen van de standaard
invoer te lezen.
De enige andere hobbel die genomen moet worden, is dat
/tmp
niet gebruikt
kan worden als tijdelijke koppeling. Symbolische
koppelingen zijn eigendom van de gebruiker en groep
bin
. Het filter wordt uitgevoerd door
de gebruiker daemon
. De map
/tmp
heeft het
sticky-bit aan staan. Het filter kan de koppeling wel
aanmaken, maar het is niet mogelijk de koppeling te
verwijderen als de opdracht is uitgevoerd, omdat de
koppeling eigendom is van een andere gebruiker.
In plaats hiervan maakt het filter een symbolische
koppeling aan in de huidige werkmap, de wachtrijmap (zoals
opgegeven in de optie sd
in
/etc/printcap
). Dit is een perfecte
plaats voor filters om hun werk te doen, zeker gezien er
(soms) meer vrije schijfruimte is in de wachtrijmap dan
onder /tmp
.
Dit is het uiteindelijke filter:
Al deze conversiefilters bieden vele mogelijkheden voor afdrukomgevingen, maar dwingen de gebruiker aan te geven (op de lpr(1) commandoregel) welk filter gebruikt moet worden. Als gebruikers niet zo vaardig zijn in het gebruik van computers, wordt het al snel vervelend steeds aan te moeten geven welk filter gebruikt moet worden. Vervelender is echter wanneer een gebruiker een verkeerd filter gebruikt voor een bepaald bestandsformaat. Het resultaat kan zijn dat een printer honderden pagina's papier uitspuugt.
In plaats van het installeren van conversiefilters, is
het te proberen om het (standaard) tekstfilter het
bestandstype van het af te drukken bestand te laten
detecteren en dan automatisch het juiste conversiefilter
aan te laten roepen. Programma's als
file
kunnen hierbij handig zijn. Voor
sommige bestandsformaten kan het
moeilijk zijn de verschillen te ontdekken en voor deze
bestanden kan alsnog een conversiefilter beschikbaar worden
gesteld.
De FreeBSD Portscollectie heeft een tekstfilter dat
automatisch converteert genaamd apsfilter
(print/apsfilter
). Het
detecteert platte tekst, PostScript® en DVI-bestanden,
voert de juiste conversie uit en druk de bestanden af.
Het wachtrijsysteem LPD ondersteunt een ander type filter waar nog geen aandacht aan is besteed: een uitvoerfilter. Een uitvoerfilter is bedoeld om alleen platte tekst af te drukken, net als een tekstfilter, maar met veel vereenvoudigingen. Wanneer een uitvoerfilter wordt gebruikt, maar geen tekstfilter, dan:
start LPD een uitvoerfilter voor de gehele opdracht, in plaats van voor elk bestand in de opdracht;
biedt LPD het uitvoerfilter niet de voorziening van het identificeren van het begin of eind van de bestanden in de afdrukopdracht;
stuurt LPD de gebruikersnaam en de hostnaam niet door aan het filter. Het is dus niet bedoeld om een afdrukadministratie bij te houden. In feite zijn er maar twee argumenten:
filter-name
-wwidth
-llength
Hierbij is width
afkomstig
van de optie pw
en
length
afkomstig van de optie
pl
voor de betreffende printer.
De eenvoud van een uitvoerfilter is verleidelijk. Als elk bestand in een afdrukopdracht op een nieuwe pagina moet beginnen, is een uitvoerfilter niet geschikt. In dat geval dient een tekstfilter (ook wel invoerfilter) gebruikt te worden (zie Tekstfilter installeren. Verder is een uitvoerfilter eigenlijk veel ingewikkelder, omdat de te verwerken bytestroom gecontroleerd moet worden op speciale tekens en steeds signalen naar zichzelf moet sturen in opdracht van LPD.
Een uitvoerfilter is noodzakelijk als voorbladen gewenst zijn en het nodig is om escape-reeksen of andere initialisatietekens te sturen voor het afdrukken van het voorblad. Maar het is tevens nutteloos als het voorblad voor rekening van de afkomstige gebruiker moet komen, aangezien LPD geen gebruiker of hostinformatie naar het uitvoerfilter stuurt.
Op een enkele printer staat
LPD het gebruik van zowel een
uitvoerfilter als van een tekst of andere filter toe. In
deze gevallen start LPD het
uitvoerfilter alleen voor het afdrukken van het voorblad (zie
Voorbladen).
LPD verwacht vervolgens van het
uitvoerfilter dat deze zichzelf stopt
door twee bytes naar het filter te sturen: ASCII 031 gevolgd
door ASCII 001. Als een uitvoerfilter deze twee bytes ziet
(031, 001), moet die stoppen door een
SIGSTOP
naar zichzelf te sturen. Als
LPD klaar is met het uitvoeren van
alle andere filters, dan herstart deze het uitvoerfilter door
er een SIGCONT
naar toe te sturen.
Als er wel een uitvoerfilter, maar geen tekstfilter is en LPD is niet bezig met het verwerken van een opdracht met platte tekst, dan gebruikt LPD het uitvoerfilter voor het afdrukken van de opdracht. Zoals eerder vermeld, drukt het uitvoerfilter elk bestand van de opdracht achter elkaar af zonder pagina-einden of andere signalen voor paginavoortgang. Dit is waarschijnlijk niet gewenst. In bijna alle gevallen is een tekstfilter nodig.
Het programma lpf
, dat eerder
geïntoduceerd is als tekstfilter, kan ook worden
uitgevoerd als uitvoerfilter. Als een ad-hoc uitvoerfilter
nodig is, maar het schrijven van de bytedetectie en
signaalverzending code niet wenselijk is, dan is
lpf
het proberen waard.
lpf
kan ook opgenomen worden in een
shellscript om initialisatiecode af te handelen die eventueel
nodig is voor een printer.
Het programma /usr/libexec/lpr/lpf
uit de gecompileerde FreeBSD-distributie is een tekstfilter
(invoerfilter) die uitvoer kan inspringen (een opdracht
gegeven met lpr
),
karakters onveranderd kan doorlaten (een opdracht gegeven met
-i
lpr
), de printpositie
voor backspaces en tabs in de opdracht kan aanpassen en
afgedrukte pagina's kan administreren. Het kan ook
functioneren als uitvoerfilter.-l
Het filter lpf
is geschikt voor vele
afdrukomgevingen. Hoewel het zelf niet in staat is
initialisatiesequenties naar een printer te sturen, is het
vrij eenvoudig om een shellscript te schrijven dat de
initialisatie doet en vervolgens lpf
aanroept.
Als lpf
afgedrukte pagina's moet
administreren, is het nodig om de juiste waarden in te vullen
voor de opties pw
en
pl
in het bestand
/etc/printcap
. Deze waarden worden
gebruikt om te bepalen hoeveel tekst er op een pagina past en
hoeveel pagina's er in een afdrukopdracht zijn afgedrukt.
Zie Printergebruik
administreren voor meer informatie.
Als er veel gebruikers zijn die allemaal verschillende printers gebruiken, dan is het te overwegen gebruik te maken van voorbladen als noodzakelijk kwaad.
Voorbladen, in het Engels ook wel bekend als banner of burst pagina's, identificeren wie een bepaalde opdracht heeft afgedrukt. Ze worden meestal bedrukt met grote, dikgedrukte letters, eventueel met een decoratieve rand, zodat ze in een stapel afdrukken opvallen tussen de afgedrukte documenten. Ze maken het gebruikers mogelijk hun afdrukopdracht snel te vinden. Het nadeel van het gebruik van voorbladen is dat er een extra blad moet worden afgedrukt voor elke opdracht, waarmee hun nut niet langer duurt dan een paar minuten. Uiteindelijk belanden ze in een papierbak of afvalberg. Voorbladen gaan vooraf aan elke opdracht, niet aan elk bestand in een opdracht, waardoor de verspilling beperkt blijft.
Het LPD-systeem kan automatisch voorbladen afdrukken als een printer direct platte tekst kan afdrukken. In geval van een PostScript®-printer, is het nodig een extern programma aan te roepen om een voorblad te genereren (zie Voorbladen op PostScript®-printers.
In de sectie Eenvoudige
printerinstallatie is het afdrukken van
voorbladen uitgeschakeld door de optie sh
(“suppress header”) in het bestand
/etc/printcap
op te geven. Om wel
voorbladen af te drukken, hoeft alleen de optie
sh
verwijderd te worden.
Dit klinkt wat al te makkelijk, of niet?
Dat klopt. Het kan nodig zijn een uitvoerfilter op te geven die initialisatiestrings naar een printer stuurt. Hier is een voorbeeld uitvoerfilter voor HP PCL-compatible printers:
Geef de locatie van het uitvoerfilter op met de optie
of
. Zie Uitvoerfilters voor
meer informatie.
Hier is een voorbeeldbestand
/etc/printcap
voor de printer
teak
die eerder is geïntroduceerd;.
Het afdrukken van voorbladen is geactiveerd en bovenstaande
uitvoerfilter is toegevoegd:
/dev/lpt0
:sd=/var/spool/lpd/teak
:mx#0:\
:if=/usr/local/libexec/hpif
:\
:vf=/usr/local/libexec/hpvf
:\
:of=/usr/local/libexec/hpof
:Als gebruikers nu een opdracht sturen naar
teak
, wordt er bij elke opdracht een
voorblad afgedrukt. Als gebruikers liever willen zoeken naar
hun afdrukken, dan kunnen ze de voorbladen onderdrukken door
de opdracht te geven met het commando
lpr
. Zie Voorbladopties
voor meer opties voor lpr(1).-h
LPD drukt een karakter voor
pagina-einde af na elk voorblad. Als een printer een ander
teken of sequentie gebruikt voor het beëindigen van
een pagina, dan kan dit opgeven worden met de optie
ff
in
/etc/printcap
.
Door het afdrukken van voorbladen aan te zetten,
produceert LPD een lang
voorblad waarop in grote letters de gebruiker,
host en opdracht te lezen zijn. Hier volgt een voorbeeld
(kelly
heeft de opdracht
“outline” afgedrukt vanaf host
rose
):
LPD geeft een paginabegin na
deze tekst, zodat de opdracht op een nieuwe pagina begint
(tenzij de optie sf
(suppress
form feeds, “onderdruk paginabegin”)
is toegevoegd bij de desbetreffende printer in
/etc/printcap
).
Als dit wenselijk is, kan LPD
ook een korte tekst op het voorblad
afdrukken; geef hiervoor de optie sb
(short banner, “kort
voorblad”) op in het bestand
/etc/printcap
. Het voorblad
ziet er dan als volgt uit:
Standaard drukt LPD het
voorblad als eerste af en vervolgens de opdracht. Om dat om
te keren, moet de optie hl
(header last, “voorblad
laatst”) in /etc/printcap
worden
opgeven.
Het gebruik van LPD's ingebouwde voorbladen dwingt een bepaald paradigma af wat betreft het administreren van printergebruik: voorbladen moeten gratis zijn.
Waarom?
Omdat het uitvoerfilter het enige externe programma is
dat controle heeft als het voorblad afgedrukt wordt dat het
gebruik zou kunnen administreren. Het heeft echter geen
beschikking over informatie over gebruiker of
host of een administratiebestand. Het heeft dus
geen idee wie voor het gebruik moet worden belast. Het
volstaat ook niet om gewoon “het aantal pagina's met
één op te hogen” door het tekstfilter of
een van de conversiefilters (dat wel beschikt over
gebruiker- en hostinformatie) te veranderen, omdat gebruikers
het afdrukken van een voorblad kunnen onderdrukken met
lpr
. Ze worden dan
aangeslagen voor voorbladen die niet zijn afgedrukt.
Milieubewuste gebruikers gebruiken vast
-h
lpr
, maar dit kan niet
worden afgedwongen.-h
Het is ook niet voldoende om elk
filter zijn eigen voorblad te laten genereren (om zo het
gebruik te kunnen administreren). Als gebruikers het
afdrukken van voorbladen willen onderdrukken met
lpr
, krijgen ze toch
een voorblad en worden er ook voor belast, aangezien
LPD geen kennis over de optie
-h
-h
doorgeeft aan de filters.
Wat zijn dan de mogelijkheden?
Accepteer het paradigma van LPD en maak voorbladen gratis;
Installeer een alternatief voor LPD, zoals LPRng. In Alternatieven voor het standaard wachtrijsysteem staat meer over andere afdruksoftware die in plaats van LPD geïnstalleerd kan worden;
Schrijf een slim
uitvoerfilter. Gewoonlijk is een uitvoerfilter bedoeld
om niet meer te doen dan het initialiseren van een
printer of wat eenvoudige karakterconversie. Het is
geschikt voor voorbladen en opdrachten met platte tekst
(als er een tekstfilter is). Maar als er een tekstfilter
is voor opdrachten met platte tekst, dan start
LPD het uitvoerfilter alleen
voor voorbladen. Het uitvoerfilter kan dan het
voorblad dat LPD genereert
analyseren om te bepalen welke gebruiker en host belast
moeten worden voor het afdrukken van het voorblad. Het
enige probleem is dat het uitvoerfilter nog steeds niet
weet in welk bestand het gebruik moet worden bijgehouden
(de naam van het bestand opgegeven in de
af
wordt niet meegegeven), maar als
een bekend bestand gebruikt wordt, kan dit in het
uitvoerfilter worden opgeven. Om het parsen af te
handelen kan gebruik gemaakt worden van de optie
sh
(short header,
“kort voorblad”) in
/etc/printcap
. Dit kan echter wat
omslachtig zijn en gebruikers waarderen zeker de meer
gulle systeembeheerder die voorbladen gratis
maakt.
Zoals hierboven beschreven, kan LPD een voorblad in platte tekst genereren, dat geschikt is voor de meeste printers. Natuurlijk kan PostScript® platte tekst niet direct afdrukken, zodat de voorbladfunctie van LPD nutteloos is.
Een voor de hand liggende manier om voorbladen te
krijgen, is elk conversiefilter en tekstfilter zijn eigen
voorblad te laten genereren. De filters moeten gebruik maken
van de argumenten gebruiker en host om een geschikt voorblad
te genereren. Het nadeel van deze methode is dat gebruikers
altijd een voorblad krijgen, ook wanneer zij een opdracht
geven met lpr
.-h
Deze methode wordt nader beschreven. Het volgende script heeft drie argumenten (gebruikersnaam, hostnaam en de naam van de opdracht) en maakt een eenvoudig PostScript®-voorblad:
Nu kan zowel het conversiefilter als het tekstfilter dit script aanroepen om eerst een voorblad te genereren en vervolgens de opdracht van de gebruiker af te drukken. Hier volgt het eerder gebruikte DVI-conversieprogramma, aangepast om een voorblad te maken:
Merk op hoe het filter eerst de argumentenlijst moet nagaan om te bepalen wat de gebruikers- en hostnaam zijn. Dit is gelijk voor de andere conversiefilters. Het tekstfilter heeft echter een andere verzameling argumenten (zie Hoe filters werken).
Zoals eerder is beschreven, is het in bovenstaande opzet,
hoewel deze simpel is, niet mogelijk “voorbladen
te onderdrukken” (de optie -h
in
lpr
). Als gebruikers een boom willen
sparen (of een paar centen bij betaalde voorbladen) dan is
dit dus niet mogelijk, aangezien elk filter een voorblad
afdrukt voor iedere opdracht.
Om gebruikers in staat te stellen per opdracht voorbladen
te onderdrukken, moet gebruik gemaakt worden van de truc
uit Voorbladen
administreren: schrijf een uitvoerfilter dat het door
LPD gegenereerde voorblad inleest en een PostScript®-versie
genereert. Als de gebruiker de opdracht geeft met
lpr
, dan genereert
LPD geen voorblad en het
uitvoerfilter ook niet. Anders leest het uitvoerfilter de
tekst van LPD in en stuurt een
geschikt voorblad in PostScript® naar de printer.-h
Voor een PostScript®-printer op een seriële lijn
kan gebruik gemaakt worden van lprps
,
dat met een uitvoerfilter wordt geleverd en het bovenstaande
kan doen. Voorbladen worden door psof
niet geteld.
FreeBSD ondersteunt afdrukken via het netwerk: het sturen van opdrachten naar printers op afstand. Afdrukken via een netwerk betekent over het algemeen twee verschillende dingen:
Het benaderen van een printer aangesloten op een andere computer. Een printer met een conventionele seriële of parallelle verbinding wordt op een bepaalde computer geïnstalleerd. Vervolgens wordt LPD zodanig ingesteld dat afdrukken vanaf andere computers in het netwerk mogelijk is. In Printers geïnstalleerd op andere hosts staat hoe dit te doen.
Het benaderen van een printer die direct is aangesloten op een netwerk. Een printer heeft een netwerkinterface naast (of in plaats van) een gewone seriële of parallelle poort. Zo een printer kan als volgt werken:
Het begrijpt het LPD protocol en kan zelfs opdrachten van andere hosts in de wachtrij plaatsen. In dit geval werkt een printer als een gewone host die LPD heeft draaien. Volg de procedure in Printers geïnstalleerd op andere hosts om een dergelijke printer te installeren
Het kan zijn dat een printer een netwerkverbinding ondersteunt. In dit geval kan een printer worden “aangesloten” op een bepaalde host op het netwerk door deze host verantwoordelijk te maken voor het plaatsen van opdrachten in een wachtrij en het versturen van opdrachten naar de printer. In Printers met netwerkinterfaces staan enkele suggesties om zulke printers te installeren.
Het wachtrijsysteem LPD heeft een ingebouwde mogelijkheid om opdrachten naar andere hosts te sturen die ook LPD draaien (of een systeem dat compatibel is met LPD). Deze eigenschap maakt het mogelijk om een printer op een host te installeren en deze toegankelijk te maken voor andere hosts. Het werkt ook met printers die over een netwerkinterface beschikken en het LPD-protocol begrijpen.
Om dit soort afdrukken op afstand mogelijk te maken, moet een printer eerst op een host geïnstalleerd worden, de printerhost, door de printerinstallatie te volgen als beschreven in Eenvoudige printerinstallatie. Stel desgewenst de printer in voor geavanceerde taken volgens Geavanceerde printerinstallatie. Test de printer en controleer of deze werkt met eventueel speciaal ingestelde opties voor LPD. De lokale host moet geautoriseerd zijn om de LPD-dienst op de verre host te gebruiken (zie Opdrachten van hosts op afstand beperken).
Als een printer een netwerkinterface heeft die compatibel is met LPD, dan is de printerhost in onderstaande beschrijving de printer zelf en de printernaam is de naam die voor de printer is ingesteld. Meer informatie staat in de documentatie bij de printer en/of de printernetwerkinterface.
Bij een HP LaserJet voert de printernaam
text
automatisch de CRLF-conversie uit.
Het is dan niet nodig het script hpif
te gebruiken.
Op hosts die toegang moeten krijgen tot de printer, moet
in /etc/printcap
een regel worden
toegevoegd met het volgende:
Geef de regel een willekeurige naam. Om het eenvoudig te houden kunnen wellicht het beste dezelfde namen en aliassen worden gebruikt als op de printerhost;
Laat de optie lp
expliciet leeg
(:lp=:
);
Maak een wachtrijmap aan en geef de locatie op met de
optie sd
.
LPD slaat hier
afdrukopdrachten op alvorens ze naar de printerhost
te sturen;
Geef de naam van de printerhost op met de optie
rm
;
Geef de naam van de printer op de
printerhost op met de optie
rp
.
Dit is het. Conversiefilters, paginadimensies,
enzovoort, hoeven niet in /etc/printcap
opgegeven te worden.
Hier volgt een voorbeeld. De host rose
heeft twee printers: bamboo
en
rattan
. Gebruikers op de host
orchid
krijgen toegang tot deze printers.
Hier volgt /etc/printcap
voor
orchid
(uit Voorbladen
afdrukken). Er stond in het bestand al een regel voor
de printer teak
. Voor de twee printers op
de host rose
zijn twee regels
toegevoegd:
/dev/lpt0
:sd=/var/spool/lpd/teak
:mx#0:\
:if=/usr/local/libexec/ifhp
:\
:vf=/usr/local/libexec/vfhp
:\
:of=/usr/local/libexec/ofhp
:
#
# rattan is aangesloten op rose; stuur opdrachten voor rattan naar rose:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan
:
#
# bamboo is ook aangesloten op rose:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo
:Op orchid
moeten wachtrijmappen worden
aangemaakt:
#
mkdir -p
/var/spool/lpd/rattan
/var/spool/lpd/bamboo
#
chmod 770 /var/spool/lpd/rattan
/var/spool/lpd/bamboo
#
chown daemon:daemon /var/spool/lpd/rattan
/var/spool/lpd/bamboo
Nu kunnen gebruikers op orchid
afdrukken
op rattan
en bamboo
.
Een gebruiker op orchid
geeft bijvoorbeeld
de volgende invoer:
%
lpr -P
bamboo -d
sushi-review.dvi
Dan kopieert LPD op
orchid
de opdracht naar de wachtrijmap
/var/spool/lpd/bamboo
en ziet dat het een DVI-opdracht is. Zodra de host
rose
ruimte heeft in zijn wachtrijmap
bamboo
, sturen de twee
LPD's het bestand naar
rose
. Het bestand wacht in de wachtrij van
rose
totdat het succesvol is afgedrukt. Het
wordt geconverteerd naar PostScript® (aangezien
bamboo
een PostScript®-printer is) op
rose
.
Netwerkkaarten voor printers zijn er in twee versies: een versie die een wachtrij nabootst (de duurdere versies), of versies die alleen de mogelijkheid geven om er informatie naar te sturen alsof het een seriële of parallelle poort is (de goedkopere versies). In Printers geïnstalleerd op andere hosts wordt het voor de duurdere beschreven.
Het formaat van /etc/printcap
maakt
het mogelijk om op te geven welke seriële, of parallelle
poort gebruikt moet worden en (in geval van een seriële
poort) de baud-snelheid, of er communicatie moet worden
toegepast, vertragingen voor tabs, conversies voor nieuwe
regelkarakters en meer. Er is geen mogelijkheid om een
verbinding met een printer op te geven die op een TCP/IP of
andere netwerkpoort luistert.
Om informatie naar een netwerkprinter te sturen, is het
nodig een programma te ontwikkelen dat door tekst- en
conversiefilters kan worden aangeroepen. Hier volgt een
voorbeeld: het script netprint
stuurt alle
informatie van de standaard invoer naar een netwerkprinter.
Als eerste argument wordt de hostnaam van de printer
opgegeven en als tweede argument het poortnummer waarmee de
verbinding moet worden opgezet. Er wordt alleen
eenrichtingcommunicatie ondersteund (FreeBSD naar printer).
Veel netwerkprinters ondersteunen tweewegcommunicatie. Het
kan wenselijk zijn hiervan gebruik te maken (om printerstatus
op te vragen, statistieken bij te houden, enzovoort).
Dit script kan vervolgens in verschillende filters
gebruikt worden. Stel dat een Diablo 750-N matrixprinter op
het netwerk is aangesloten. Op poort 5100 accepteert de
printer informatie om af te drukken. De hostnaam van de
printer is scrivener
. Hier volgt het
tekstfilter voor de printer:
Nu volgt informatie over het beperken van printergebruik. Het LPD-systeem maakt het mogelijk te bepalen wie er toegang heeft tot een printer, zowel lokaal als op afstand, of meerdere kopieën afgedrukt mogen worden, hoe lang opdrachten mogen zijn en hoe lang wachtrijen mogen worden.
Het LPD systeem maakt het heel
makkelijk voor gebruikers om meerdere afdrukken van een
bestand te maken. Gebruikers kunnen opdrachten afdrukken met
bijvoorbeeld lpr
en
krijgen dan vijf kopieën van elk bestand in de opdracht.
De systeembeheerder kan beslissen of dit wenselijk is.-#5
Wanneer meerdere kopieën onwenselijk zijn, kan de
optie -#
van lpr(1) worden
uitgeschakeld door de optie sc
in
/etc/printcap
op te nemen. Als
gebruikers opdrachten versturen met de optie
-#
, zien ze het volgende:
Als het mogelijk is van andere hosts af te drukken (zie
Printers
geïnstalleerd op andere hosts), moet de optie
sc
ook in
/etc/printcap
van de andere hosts
aanwezig zijn. Anders kunnen gebruikers nog steeds
multi-kopie opdrachten van andere hosts sturen.
Hier volgt een voorbeeld. Hieronder staat
/etc/printcap
voor de host
rose
. De printer rattan
is redelijk krachtig, dus meerdere kopieën zijn
toegestaan. De laserprinter bamboo
is wat
gevoeliger, dus meerdere kopieë zijn uitgeschakeld door
de optie sc
toe te voegen:
/var/spool/lpd/rattan
:\
:lp=/dev/lpt0
:\
:if=/usr/local/libexec/if-simple
:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo
:sc:\
:lp=/dev/ttyu5
:ms#-parenb cs8 clocal crtscts:rw:\
:if=/usr/local/libexec/psif
:\
:df=/usr/local/libexec/psdf
:Nu moet ook de optie sc
worden
toegevoegd in /etc/printcap
van host
orchid
(tegelijk worden meerdere
kopieën voor de printer teak
uitgeschakeld):
/dev/lpt0
:sd=/var/spool/lpd/teak
:mx#0:sc:\
:if=/usr/local/libexec/ifhp
:\
:vf=/usr/local/libexec/vfhp
:\
:of=/usr/local/libexec/ofhp
:
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan
:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo
:sc:Door de optie sc
te gebruiken, wordt
het gebruik van lpr
voorkomen, maar dat weerhoudt gebruikers er nog steeds niet
van om lpr(1) meerdere keren te aanroepen of meerdere
keren hetzelfde bestand te versturen in een opdracht:-#i
%
lpr voorverkoop.teken voorverkoop.teken voorverkoop.teken voorverkoop.teken voorverkoop.teken
Er zijn vele manieren om dit misbruik te voorkomen (onder andere door het te negeren), welke vrij zijn om te verkennen.
Door gebruik te maken van het UNIX® groepmechanisme en
de optie rg
in
/etc/printcap
kan geregeld worden wie er
op welke printer kan afdrukken. De gebruikers die toegang
hebben tot een printer moeten in een groep worden geplaatst
en deze groep moet in de optie rg
worden
genoemd.
Als gebruikers buiten de groep (inclusief
root
) naar de beheerde printer proberen
te printen, worden ze begroet met het volgende bericht:
Net als met de optie sc
(suppress multiple copies: onderdruk
meerdere kopieën) moet rg
, indien
wenselijk, ook op andere hosts worden opgegeven die ook
toegang hebben tot printers (zie Printers
geïnstalleerd op andere hosts).
In het volgende voorbeeld heeft iedereen toegang tot de
printer rattan
, maar alleen gebruikers in
de groep artists
kunnen gebruik maken
van bamboo
. Hier volgt het bekende
/etc/printcap
voor de host
rose
:
/var/spool/lpd/rattan
:\
:lp=/dev/lpt0
:\
:if=/usr/local/libexec/if-simple
:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo
:sc:rg=artists:\
:lp=/dev/ttyu5
:ms#-parenb cs8 clocal crtscts:rw:\
:if=/usr/local/libexec/psif
:\
:df=/usr/local/libexec/psdf
:De andere voorbeeldbestanden
/etc/printcap
(voor de host
orchid
) worden niet aangepast. Natuurlijk
kan iedereen op orchid
afdrukken op
bamboo
. Het kan zijn dat er sowieso alleen
bepaalde gebruikers op orchid
zijn
toegestaan en dat deze gebruikers toegang mogen hebben tot de
printer. Of wellicht niet.
Er kan per printer slechts één groep worden opgegeven.
Als veel gebruikers toegang hebben tot printers kan het nodig zijn een limiet op te geven voor de grootte van de bestanden die gebruikers naar een printer kunnen sturen. Er is immers slechts beperkte ruimte op het bestandssysteem en er moet ook voldoende ruimte zijn voor opdrachten van andere gebruikers.
LPD heeft de mogelijkheid om
met de optie mx
een limiet op te geven
voor het maximum aantal bytes van een bestand in een
afdrukopdracht. De eenheden worden opgegeven in
BUFSIZ
blokken, die 1024 bytes groot zijn.
Een nul voor deze optie betekent geen limiet aan de
bestandsgrootte. Als de optie wordt weggelaten, wordt een
standaardlimiet van 1000 blokken gebruikt.
De limiet heeft betrekking op de bestanden in een opdracht, niet op de totale grootte van een opdracht.
LPD weigert een bestand dat groter is dan de opgegeven limiet niet. In plaats daarvan plaatst het zo veel mogelijk van het bestand op de wachtrij, om dit vervolgens af te drukken. De rest wordt genegeerd. Of dit gedrag wenselijk is, is onderwerp van debat.
Nu worden limieten voor de voorbeeldprinters
rattan
en bamboo
opgegeven. Aangezien de PostScript®-bestanden van die
artists
nogal groot kunnen worden,
krijgen ze een limiet van vijf megabyte opgelegd. Er wordt
geen limiet opgelegd voor de platte tekst printer:
/var/spool/lpd/rattan
:\
:lp=/dev/lpt0
:\
:if=/usr/local/libexec/if-simple
:
#
# Limiet van vijf megabyte:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo
:sc:rg=artists:mx#5000:\
:lp=/dev/ttyu5
:ms#-parenb cs8 clocal crtscts:rw:\
:if=/usr/local/libexec/psif
:\
:df=/usr/local/libexec/psdf
:Ook hier zijn de limieten alleen van toepassing op lokale
gebruikers. Als toegang tot deze printers van andere hosts
mogelijk is, worden deze gebruikers niet beperkt. Het is
daarom nodig de optie mx
ook in de
/etc/printcap
van de betreffende hosts
op te geven. In Printers
geïnstalleerd op andere hosts staat meer
informatie over afdrukken op andere hosts.
Er is een andere gespecialiseerde manier om opdrachtgrootte voor printers op afstand te beperken (zie Opdrachten van hosts op afstand beperken.
Het wachtrijsysteem LPD beschikt over verschillende methoden om afdrukopdrachten van hosts op afstand te beperken:
Met de bestanden
/etc/hosts.equiv
en
/etc/hosts.lpd
kan worden
ingesteld van welke hosts op afstand een lokale
LPD-opdracht wordt
geaccepteerd. LPD
controleert of een inkomend verzoek afkomstig is van
een host die wordt genoemd in een van deze bestanden.
Zo niet, dan weigert LPD het
verzoek.
Het formaat van deze bestanden is eenvoudig:
één host per regel.
/etc/hosts.equiv
wordt ook
gebruikt door het protocol ruserok(3) en heeft
invloed op programma's als rsh(1) en rcp(1).
Voorzichtigheid is dus geboden.
Als voorbeeld volgt hier
/etc/hosts.lpd
voor de host
rose
:
Dit betekent dat rose
verzoeken
accepteert van de hosts orchid
,
violet
en
madrigal.fishbaum.de
.
Voor iedere andere host die verbinding probeert te
maken met LPD op
rose
, wordt de opdracht
geweigerd.
De hoeveelheid vrije ruimte die over moet blijven
op een bestandssysteem waar een wachtrij zich bevindt
kan ook worden ingesteld. Hiervoor moet een bestand
met de naam minfree
in de
wachtrijmap worden aangemaakt. In dit bestand kan
een getal worden gezet dat het aantal schijfblokken
(512 bytes) aan vrije ruimte aangeeft dat beschikbaar
moet blijven wil een opdracht worden
geaccepteerd.
Hiermee kan worden gegarandeerd dat gebruikers op
afstand een bestandssysteem niet vol kunnen schrijven.
Ook kan hierdoor een soort voorrang worden gegeven aan
lokale gebruikers: zij kunnen nog opdrachten plaatsen
als de vrije schijfruimte al lang beneden de opgegeven
limiet uit minfree
is
gekomen.
Als voorbeeld wordt een bestand
minfree
voor de printer
bamboo
toegevoegd. In
/etc/printcap
staat de juiste
wachtrijmap:
/var/spool/lpd/bamboo
:sc:rg=artists:mx#5000:\
:lp=/dev/ttyu5
:ms#-parenb cs8 clocal crtscts:rw:mx#5000:\
:if=/usr/local/libexec/psif
:\
:df=/usr/local/libexec/psdf
:De wachtrijmap wordt opgegeven met de optie
sd
. Er wordt een limiet van drie
megabyte ingesteld (wat gelijk staat aan 6144
schijfblokken) voor de hoeveelheid vrije schijfruimte
die op het bestandssysteem beschikbaar moet zijn
voordat LPD een opdracht op
afstand accepteert:
#
echo 6144 > /var/spool/lpd/bamboo/minfree
Met de optie rs
in
/etc/printcap
kan worden geregeld
welke gebruikers op afstand kunnen afdrukken op lokale
printers. Als rs
voorkomt voor
een lokale printer accepteert
LPD opdrachten van hosts op
afstand als de gebruiker die de
opdracht wil plaatsen ook een account heeft met
dezelfde gebruikersnaam op de lokale host. Anders
weigert LPD de
opdracht.
Deze optie is met name nuttig in een omgeving waar
(bijvoorbeeld) verschillende afdelingen een netwerk
delen en gebruikers de grenzen van de afdeling
overschrijden. Door ze een account te geven op een
systeem kunnen ze de aangesloten printers gebruiken
vanaf het systeem van hun eigen afdeling. Wanneer ze
alleen gebruik mogen maken van de
printers en niet van overige diensten op de computer,
kunnen “tokenaccounts” worden aangemaakt,
zonder thuismap en met een nutteloze shell als
/usr/bin/false
.
Het kan nodig zijn om afdrukken te doorbelasten. Inkt en papier kosten geld en er zijn onderhoudskosten. Printers zitten vol met bewegende delen en hebben de neiging kapot te gaan. Nu is er gekeken naar de printers, het gebruikerspatroon en de onderhoudskosten en op basis hiervan is een prijs vastgesteld per pagina (of per centimeter, per meter, of per wat dan ook). Hoe wordt nu een administratie bijgehouden van gemaakte afdrukken?
Het slechte nieuws is dat het wachtrijsysteem LPD hierbij niet echt helpt. Het administreren van afdrukken is erg afhankelijk van het type printer, het afdrukformaat en de wensen die een systeembeheerder heeft ten aanzien van het doorbelasten van printergebruik.
Om het administreren te implementeren, is het nodig om aanpassingen te maken in de tekstfilter (om platte tekst opdrachten te belasten) en de conversiefilters (om opdrachten in andere bestandsformaten te belasten), om pagina's te tellen, of de printer te vragen hoeveel pagina's er zijn afgedrukt. Het volstaat niet om het eenvoudige uitvoerfilter te gebruiken, aangezien dit niet in staat is het gebruik te administreren. Zie Filters.
In het algemeen zijn er twee manieren om gebruik te administreren:
Periodiek administreren is de meer gebruikelijke manier, omdat het waarschijnlijk makkelijker is. Als iemand een opdracht afdrukt, schrijft het filter de gebruiker, host en het aantal pagina's in een administratiebestand. Elke maand, semester, jaar, of een andere gewenste periode kunnen de administratiebestanden verzameld worden om het aantal afgedrukte pagina's op te tellen en het gebruik in rekening te brengen. De logboekbestanden kunnen vervolgens geschoond worden, zodat met een schone lei de volgende periode begonnen kan worden.
Directe administratie is minder gebruikelijk, waarschijnlijk omdat het moeilijker is. Met deze methode zorgen de filters ervoor dat gebruikers voor hun printergebruik worden afgerekend op het moment dat ze er gebruik van maken. Net als schijfquota is de administratie onmiddellijk. Hiermee wordt voorkomen dat gebruikers kunnen afdrukken wanneer ze over hun limiet zijn gegaan. Ook biedt dit de mogelijkheid voor gebruikers om hun afdrukquotum te controleren, of aan te passen. Deze methode vereist databasecode om gebruikers en hun quota bij te houden.
Het wachtrijsysteem LPD ondersteunt beide methoden op eenvoudige wijze. Aangezien de filters (meestal) moeten worden aangeleverd, moet ook de code voor de administratie worden geleverd. Er is echter een voordeel: er is grote flexibiliteit in de administratiemethode. Zo kan bijvoorbeeld gekozen worden tussen periodieke of directe administratie. Er kan gekozen worden welke informatie opgeslagen wordt: gebruikersnamen, hostnamen, type opdracht, aantal afgedrukte pagina's, hoe lang het afdrukken duurde, enzovoort. Dit alles kan worden gedaan door de filters aan te passen.
FreeBSD wordt met twee programma's geleverd waarmee
periodieke administratie direct kan worden opgezet. Het zijn
het tekstfilter lpf
, beschreven in lpf: een
tekstfilter en pac(8), een programma dat posten
uit administratiebestanden verzamelt en optelt.
Zoals beschreven in de sectie over filters (Filters), roept
LPD de tekst- en conversiefilters
aan met de naam van het administratiebestand als argument.
De filters kunnen dit argument gebruiken om te bepalen in
welk bestand de gegevens voor de administratie moeten worden
weggeschreven. De naam van dit bestand is afkomstig van de
optie af
uit
/etc/printcap
. Als er geen absoluut pad
wordt opgegeven, dan is de locatie relatief aan de
wachtrijmap.
LPD start
lpf
met paginabreedte en -lengte
argumenten (afkomstig uit de opties pw
en
pl
). Het filter lpf
gebruikt deze argumenten om te bepalen hoeveel papier er
gebruikt zal worden. Nadat het bestand naar de printer is
gestuurd, schrijft het een post in het administratiebestand.
De posten zien er als volgt uit:
Aangezien lpf
geen ingebouwde logica
voor bestandslocking kent, moet voor elke printer een apart
administratiebestand gebruikt worden. Twee
lpf
s kunnen elkaars posten corrumperen als
ze tegelijk in hetzelfde bestand schrijven. De optie
af=acct
in
/etc/printcap
biedt een makkelijke
manier om er zeker van te zijn dat aparte bestanden worden
gebruikt. Dan bevindt elk administratiebestand zich in de
wachtrijmap van de betreffende printer en krijgt de naam
acct
krijgen
Wanneer het tijd is om met gebruikers af te rekenen voor
hun afdrukken, kan het programma pac(8) gedraaid worden.
Ga naar de wachtrijmap van de printer waarvoor betaald moet
worden en typ pac
. Er verschijnt een
dollar-centrische samenvatting zoals het volgende:
Dit zijn de argumenten die pac(8) verwacht:
-Pprinter
De printer
waarvoor een
samenvatting moet worden gegenereerd. Deze optie werkt
alleen als er een absoluut pad is gegeven in de optie
af
in
/etc/printcap
.
-c
Sorteer de uitvoer op kosten, in plaats van alfabetisch op gebruikersnaam.
-m
Negeer de hostnamen in het administratiebestand.
Met deze optie is de gebruiker
smith
op host
alpha
dezelfde gebruiker als
smith
op host
gamma
. Zonder deze optie zijn het
verschillende gebruikers.
-pprijs
Bereken de prijs met
prijs
dollar per pagina of
per voet, in plaats van de prijs uit de optie
pc
in
/etc/printcap
of twee cent (de
standaard). De prijs
kan
worden opgegeven als een decimaal getal.
-r
Keer de sorteervolgorde om.
-s
Maak een bestand met een samenvatting van de administratie en leeg het administratiebestand.
namen
…
Druk de administratiegegevens alleen af voor
gebruikersnamen namen
.
In de standaard samenvatting die pac(8) genereert,
is het aantal pagina's te zien dat iedere gebruiker vanaf een
bepaalde host heeft afgedrukt. Wanneer de hostnaam niet
van belang is (bijvoorbeeld omdat gebruikers iedere host
kunnen gebruiken), gebruik dan pac
om de volgende samenvatting te
genereren:-m
Om het verschuldigde bedrag te berekenen gebruikt
pac(8) de optie pc
uit
/etc/printcap
(standaard aantal van 200
of 2 cent per pagina). Specificeer, in honderden
centen, de prijs per pagina of per voet die berekent moet
worden. Deze waarde kan worden aangepast door pac(8)
aan te roepen met de optie -p
. De eenheden
van de optie -p
zijn echter in dollars, niet
in honderden centen. Bijvoorbeeld,
#
pac -p1.50
zorgt ervoor dat elke pagina 1,50 dollar kost. U kunt echt grote winsten maken met deze optie.
Tenslotte kan met pac
de samenvatting worden
opgeslagen in een bestand dat dezelfde naam krijgt als het
administratiebestand van de printer, maar dan met
-s
_sum
toegevoegd aan de naam. Vervolgens
wordt het administratiebestand geleegd. Als pac(8)
opnieuw wordt aangeroepen, herleest pac(8) het
samenvattingsbestand om de startwaarden te bepalen en telt
daar de informatie bij op van het standaard
administratiebestand.
Om ook maar de minste nauwkeurigheid bij het administreren te verkrijgen, is het nodig te weten hoeveel papier een afdrukopdracht gebruikt. Dit is het centrale probleem van het bijhouden van printerstatistieken.
Voor opdrachten met platte tekst is het probleem niet zo moeilijk op te lossen: het aantal regels in een opdracht wordt geteld en vergeleken met het aantal regels per pagina dat door een printer wordt ondersteund. Hierbij moet niet worden vergeten dat backspaces in het bestand regels overschrijven en dat lange logische regels worden afgedrukt als meerdere fysieke regels.
Het tekstfilter lpf
(geïntroduceerd in lpf: een
tekstfilter) houdt met deze zaken rekening bij het
administreren. Als het nodig is een tekstfilter te schrijven
dat ook het printergebruik moet bijhouden, dan is het nuttig
de broncode van lpf
te bestuderen.
Hoe worden andere bestandsformaten dan verwerkt?
Voor een DVI-naar-LaserJet, of DVI-naar-PostScript®
conversie kan het filter de diagnostische uitvoer van
dvilj
of dvips
bekijken
om te bepalen hoeveel pagina's er zijn geconverteerd. Voor
andere formaten kan hetzelfde worden gedaan met behulp van de
betreffende conversieprogramma's.
Deze methoden hebben echter als nadeel dat een printer eventueel niet alle pagina's ook daadwerkelijk afdrukt. Zo kan het papier vast komen te zitten, de toner opraken of de printer ontploffen, terwijl de gebruiker toch moet betalen.
Dus, wat kan hieraan worden gedaan?
Er is slechts één betrouwbare manier om nauwkeurig te administreren. Dat is met behulp van een printer die kan vertellen hoeveel papier er is gebruikt. Deze moet vervolgens worden aangesloten met een seriële lijn, of een netwerkverbinding. Bijna alle PostScript®-printers hebben deze mogelijkheid, andere modellen en merken mogelijk ook (bijvoorbeeld Imagen netwerklaserprinters). De filters dienen voor deze printers aangepast te worden om het papierverbruik na elke opdracht te achterhalen en de administratieve informatie alleen op deze waarde te baseren. Er is geen noodzaak om foutgevoelig regels te tellen of bestanden te analyseren.
Natuurlijk kan een beheerder ook vrijgevig zijn en alle afdrukken gratis maken.