Εγχειρίδιο του FreeBSD
Προηγ | Κεφάλαιο 9 Εκτυπώσεις | Επόμενο

# 9.4 Ρυθμίσεις Εκτυπωτών για Προχωρημένους

Αυτή η ενότητα περιγράφει φίλτρα για την εκτύπωση ειδικής μορφής αρχείων, σελίδων κεφαλίδας, για εκτυπώσεις μέσω δικτύου, καθώς και για τον έλεγχο πρόσβασης και την καταμέτρηση χρήσης των εκτυπωτών.

## 9.4.1 Φίλτρα

Αν και το LPD μπορεί να χειριστεί πρωτόκολλα δικτύων, λίστες αναμονής, έλεγχο πρόσβασης, και άλλες παραμέτρους των εκτυπώσεων, το κύριο μέρος της πραγματικής εργασίας γίνεται με τα φίλτρα. Τα φίλτρα είναι προγράμματα που επικοινωνούν με τον εκτυπωτή και χειρίζονται τις εξαρτήσεις της συσκευής και άλλες ειδικές απαιτήσεις της. Στην απλή εγκατάσταση εκτυπωτή, εγκαταστήσαμε ένα φίλτρο απλού κειμένου ιδιαίτερα απλής μορφής, που θα πρέπει να δουλεύει με τους περισσότερους εκτυπωτές (ενότητα Εγκατάσταση Φίλτρου Κειμένου).

Ωστόσο, για να μπορέσετε να εκμεταλλευτείτε τις δυνατότητες μετατροπών μορφής, ελέγχου πρόσβασης και καταμέτρησης, και τυχόν ειδικές δυνατότητες του εκτυπωτή σας, θα πρέπει να καταλάβετε πως δουλεύουν τα φίλτρα. Σε τελική ανάλυση, θα είναι ευθύνη των φίλτρων να χειρίζονται όλες αυτές τις παραμέτρους. Τα κακά νέα είναι πως τις περισσότερες φορές θα πρέπει να παρέχετε εσείς οι ίδιοι τα φίλτρα σας. Τα καλά νέα είναι πως γενικώς υπάρχουν αρκετά διαθέσιμα, και αν δεν υπάρχουν, είναι σχετικά εύκολο να τα γράψετε.

Επίσης, το FreeBSD διατίθεται με ένα φίλτρο, το `/usr/libexec/lpr/lpf`, που δουλεύει με πολλούς εκτυπωτές που μπορούν να εκτυπώσουν απλό κείμενο. (Χειρίζεται backspacing και tabs στο αρχείο, και κάνει καταμέτρηση, αλλά τίποτα περισσότερο.) Υπάρχουν, επίσης, διάφορα άλλα φίλτρα και συστατικά τους στην Συλλογή των Ports του FreeBSD.

Σε αυτή την ενότητα θα βρείτε: :

- Η ενότητα Πως δουλεύουν τα Φίλτρα, προσπαθεί να δώσει μια γενική άποψη για τις αρμοδιότητες των φίλτρων στις διεργασίες εκτύπωσης. Θα πρέπει να διαβάσετε αυτή την ενότητα για να μπορείτε να καταλάβετε τι «πραγματικά» συμβαίνει όταν το LPD χρησιμοποιεί φίλτρα. Αυτές οι γνώσεις θα σας βοηθήσουν να προλαμβάνετε και να αποσφαλματώνετε προβλήματα που μπορούν να συμβούν καθώς εγκαθιστάτε όλο και περισσότερα φίλτρα σε κάθε εκτυπωτή σας.

- Το LPD αναμένει πως κάθε εκτυπωτής είναι ικανός, από προεπιλογή, να εκτυπώσει απλό κείμενο. Αυτό όμως είναι πρόβλημα για εκτυπωτές PostScript® (ή άλλους που βασίζονται σε γλώσσες προγραμματισμού) οι οποίοι δεν μπορούν να εκτυπώσουν άμεσα απλό κείμενο. Η ενότητα Συμβατότητα Εργασιών Απλού Κειμένου σε εκτυπωτές PostScript σας εξηγεί τι θα πρέπει να κάνετε για να ξεπεράσετε αυτό το πρόβλημα. Θα πρέπει να διαβάσετε αυτή την ενότητα αν έχετε εκτυπωτή PostScript.

- Το PostScript είναι δημοφιλής μορφή εξόδου για πολλά προγράμματα. Μερικοί άνθρωποι προτιμούν και να γράφουν κατευθείαν σε κώδικα PostScript. Δυστυχώς, οι εκτυπωτές PostScript έχουν μεγάλο κόστος. Η ενότητα Προσομοίωση PostScript για εκτυπωτές που δεν το υποστηρίζουν εξηγεί λεπτομερώς πως να μετατρέψετε ένα φίλτρο κειμένου για εκτυπωτές ώστε να λαμβάνει και να τυπώνει δεδομένα PostScript σε εκτυπωτές που δεν είναι PostScript. Θα πρέπει να διαβάσετε αυτήν την ενότητα αν είστε κάτοχος εκτυπωτή που δεν υποστηρίζει PostScript.

- Η ενότητα Φίλτρα Μετατροπής περιγράφει μια αυτοματοποιημένη διαδικασία για την μετατροπή αρχείων ειδικής μορφής, όπως δεδομένα γραφικών ή στοιχειοθεσίας, σε μια μορφή κατανοητή από τον εκτυπωτή σας. Μετά την ανάγνωση αυτής της ενότητας, θα πρέπει να είστε σε θέση να ρυθμίσετε τους εκτυπωτές σας με τέτοιο τρόπο ώστε πληκτρολογώντας `lpr `-t`` οι χρήστες σας να μπορούν να εκτυπώσουν δεδομένα troff, ή με `lpr `-d`` δεδομένα TeX DVI, ή με `lpr `-v`` να εκτυπώνουν εικόνες δεδομένων ράστερ, και ούτω καθεξής. Σας συμβουλεύουμε να διαβάσετε αυτή την ενότητα.

- Η ενότητα Φίλτρα Εξόδου περιγράφει ένα χαρακτηριστικό του LPD που δεν χρησιμοποιείται συχνά: τα φίλτρα εξόδου. Μπορείτε να προσπεράσετε αυτή την ενότητα, εκτός αν τυπώνετε σελίδες κεφαλίδας (δείτε τις Σελίδες Κεφαλίδας).

- Η ενότητα lpf: ένα Φίλτρο Κειμένου περιγράφει το `lpf`, ένα πραγματικά πλήρες, αν και απλό, φίλτρο κειμένου για εκτυπωτές γραμμής (και εκτυπωτές laser που μπορούν να λειτουργήσουν και ως εκτυπωτές γραμμής) που περιέχεται στο FreeBSD. Αν χρειάζεστε ένα γρήγορο τρόπο για να κάνετε την καταμέτρηση σελίδων να δουλεύει σε απλό κείμενο, ή αν έχετε κάποιον εκτυπωτή που βγάζει καπνούς όταν βλέπει χαρακτήρες backspace, θα πρέπει οπωσδήποτε να εξετάσετε την περίπτωση του `lpf`.

> Σημείωση: Μπορείτε να βρείτε αντίγραφο των διάφορων scripts που αναφέρονται παρακάτω, στον κατάλογο `/usr/share/examples/printing`.

### 9.4.1.1 Πως Δουλεύουν τα Φίλτρα

Όπως αναφέραμε προηγουμένως, φίλτρο είναι ένα εκτελέσιμο πρόγραμμα που ενεργοποιείται από το LPD για να χειρίζεται το τμήμα της επικοινωνίας με τον εκτυπωτή που εξαρτάται από τον τύπο της ίδιας της συσκευής.

Όταν το LPD θέλει να εκτυπώσει ένα αρχείο μιας εργασίας, ξεκινά το πρόγραμμα του φίλτρου. Θέτει ως standard input του φίλτρου το αρχείο που πρέπει να εκτυπωθεί, ως standard output τον ίδιο τον εκτυπωτή και ως standard error το αρχείο αναφοράς σφαλμάτων (αναφέρεται στην ικανότητα `lf` του `/etc/printcap`, ή από προεπιλογή το `/dev/console`).

Το φίλτρο που θα ξεκινήσει το LPD καθώς και οι παράμετροι του φίλτρου, εξαρτώνται από το τι έχετε δηλώσει στο αρχείο `/etc/printcap` και από το τι παραμέτρους έχει καθορίσει ο ίδιος ο χρήστης για την εργασία με την γραμμή εντολής lpr(1). Για παράδειγμα, αν ο χρήστης πληκτρολογήσει `lpr `-t``, το LPD θα ξεκινήσει το φίλτρο troff, που υποδηλώνεται με την ικανότητα `tf` για τον εκτυπωτή προορισμού. Αν ο χρήστης επιθυμεί να εκτυπώσει απλό κείμενο, θα ξεκινήσει το φίλτρο `if` (αυτό πράγματι ισχύει τις περισσότερες φορές: δείτε τα Φίλτρα Εξόδου για λεπτομέρειες).

Υπάρχουν τρεις τύποι φίλτρων που μπορείτε να προσδιορίσετε στο `/etc/printcap`:

- Το φίλτρο κειμένου, επονομαζόμενο και ως φίλτρο εισόδου στην τεκμηρίωση του LPD, χειρίζεται εκτυπώσεις κανονικού κειμένου. Θεωρήστε το ως το προεπιλεγμένο φίλτρο. Το LPD αναμένει πως όλοι οι εκτυπωτές, από προεπιλογή, είναι σε θέση να εκτυπώσουν απλό κείμενο, και είναι δουλειά του φίλτρου κειμένου να βεβαιωθεί ότι τα backspaces, τα tabs, και όλοι οι άλλοι ειδικοί χαρακτήρες δεν πρόκειται να προβληματίσουν τον εκτυπωτή. Εάν βρίσκεστε σε ένα περιβάλλον όπου θα πρέπει να καταμετρήσετε την χρήση των εκτυπωτών, το φίλτρο κειμένου θα πρέπει επίσης να καταμετρήσει τις εκτυπωμένες σελίδες, συνήθως μετρώντας τον αριθμό των εκτυπωμένων γραμμών και συγκρίνοντας τον με τον αριθμό των γραμμών που υποστηρίζει ο εκτυπωτής ανά σελίδα. Το φίλτρο κειμένου ξεκινά με την ακόλουθη λίστα παραμέτρων:

  `filter-name` [-c] -w`width` -l`length` -i`indent` -n `login` -h `host` `acct-file`

  όπου
  `-c`

    εμφανίζεται αν η εργασία έχει αποσταλεί με `lpr `-l``

  `width`

    είναι η τιμή από την ικανότητα `pw` (πλάτος σελίδας - page width) όπως προσδιορίζεται στο `/etc/printcap`, με προεπιλεγμένη τιμή το 132

  `length`

    είναι η τιμή από την ικανότητα `pl` (μήκος σελίδας - page length), με προεπιλεγμένη τιμή το 66

  `indent`

    είναι το μέγεθος της εσοχής (indentation) από το `lpr `-i``, με προεπιλεγμένη τιμή 0

  `login`

    είναι το καταγεγραμμένο όνομα χρήστη που εκτυπώνει το αρχείο

  `host`

    είναι το όνομα του υπολογιστή από τον οποίο στάλθηκε η εργασία

  `acct-file`

    είναι το όνομα του αρχείου καταμέτρησης από την ικανότητα `af`.

- Ένα φίλτρο μετατροπής μετατρέπει ένα αρχείο ειδικής μορφής σε ένα τύπο αρχείου κατάλληλο για εκτύπωση από τον συγκεκριμένο εκτυπωτή. Για παράδειγμα, τα δεδομένα στοιχειοθεσίας ditroff δεν μπορούν να εκτυπωθούν κατευθείαν, αλλά μπορείτε να εγκαταστήσετε ένα φίλτρο μετατροπής αρχείων ditroff, ώστε να μετατρέψετε τα δεδομένα ditroff σε μια μορφή που ο εκτυπωτής να μπορεί να αφομοιώσει και να τυπώσει. Θα μάθετε περισσότερα στην ενότητα Φϊλτρα Μετατροπής. Τα φίλτρα μετατροπής επίσης χρειάζονται για να κάνετε αρίθμηση/καταμέτρηση, αν χρειάζεστε καταμέτρηση των εκτυπώσεων σας. Τα φίλτρα μετατροπής ξεκινούν με τις ακόλουθες παραμέτρους:

  `filter-name` -x`pixel-width` -y`pixel-height` -n `login` -h `host` `acct-file`

  όπου `pixel-width` είναι η τιμή από την ικανότητα `px` (προεπιλεγμένη τιμή 0) και `pixel-height` είναι η τιμή από την ικανότητα `py` (προεπιλεγμένη τιμή 0).

- Το φίλτρο εξόδου χρησιμοποιείται μόνον αν δεν υπάρχει φίλτρο κειμένου, ή αν είναι ενεργοποιημένες οι σελίδες κεφαλίδας. Διαβάστε τη σχετική ενότητα Φίλτρα Εξόδου, αν και από την εμπειρία μας μπορούμε να σας πούμε ότι χρησιμοποιούνται σπάνια. Υπάρχουν μόνο δύο παράμετροι για τα φίλτρα εξόδου:

  `filter-name` -w`width` -l`length`

  οι οποίες είναι πανομοιότυπες με τις παραμέτρους `-w` και `-l` των φίλτρων κειμένου.

Τα φίλτρα θα πρέπει επίσης να τερματίζουν με κάποια από τις ακόλουθες καταστάσεις εξόδου:

exit 0

  Αν το φίλτρο τύπωσε επιτυχώς το αρχείο.

exit 1

  Αν το φίλτρο απέτυχε να τυπώσει το αρχείο, αλλά θέλει το LPD να προσπαθήσει να εκτυπώσει το αρχείο ξανά. Το LPD θα ξεκινήσει ξανά το φίλτρο αν γίνει έξοδος με αυτή την κατάσταση.

exit 2

  Αν το φίλτρο απέτυχε να εκτυπώσει το αρχείο και δεν θέλει το LPD να προσπαθήσει ξανά. Το LPD θα απορρίψει το αρχείο.

Το φίλτρο κειμένου που έρχεται με την κανονική έκδοση του FreeBSD, `/usr/libexec/lpr/lpf`, εκμεταλλεύεται τις παραμέτρους πλάτους και μήκους σελίδας για να προσδιορίσει πότε να αποστείλει το form feed και πως να κάνει καταμέτρηση. Χρησιμοποιεί τις παραμέτρους για login, host, και αρχείου καταμέτρησης για να δημιουργήσει τις σχετικές εγγραφές καταμέτρησης.

Αν είστε στη διαδικασία επιλογής φίλτρων, ελέγξτε αν είναι συμβατά με το LPD. Αν είναι συμβατά, τότε πρέπει να υποστηρίζουν την λίστα παραμέτρων που περιγράψαμε προηγουμένως. Αν σχεδιάζετε να γράψατε τα δικά σας φίλτρα γενικής χρήσης, τότε πρέπει να τα κάνετε να υποστηρίζουν την ίδια λίστα παραμέτρων και κωδικών εξόδου.

### 9.4.1.2 Συμβατότητα Εργασιών Απλού Κειμένου σε Εκτυπωτές PostScript®

Αν είστε ο μοναδικός χρήστης του Η/Υ σας και του εκτυπωτή PostScript (ή άλλης γλώσσας εκτυπωτών), και είστε σίγουροι πως δεν πρόκειται να στείλετε ποτέ εκτυπώσεις απλού κειμένου στον εκτυπωτή σας και πως δεν θα χρησιμοποιήσετε τις υπηρεσίες των διαφόρων προγραμμάτων σας που θα θελήσουν να στείλουν απλό κείμενο στον εκτυπωτή σας, τότε δεν χρειάζεται να ασχοληθείτε καθόλου με αυτή την ενότητα.

Αλλά, αν επιθυμείτε να στείλετε τόσο εργασίες PostScript όσο και απλού κειμένου στον εκτυπωτή σας, τότε σας προτρέπουμε να προσθέσετε κάποιες ρυθμίσεις στην εγκατάσταση σας. Για να γίνει αυτό, θα πρέπει το φίλτρο κειμένου να ανιχνεύει αν η τρέχουσα εργασία είναι απλό κείμενο ή PostScript. Όλες οι εργασίες PostScript πρέπει να ξεκινούν με `%!` (αν ο εκτυπωτής σας χρησιμοποιεί άλλη γλώσσα, συμβουλευθείτε την τεκμηρίωση του). Αν είναι αυτοί οι πρώτοι δύο χαρακτήρες, τότε έχουμε PostScript, και η υπόλοιπη εργασία μπορεί να σταλεί απευθείας στον εκτυπωτή. Αν δεν είναι αυτοί οι πρώτοι δύο χαρακτήρες, τότε το φίλτρο θα μετατρέψει το κείμενο σε PostScript και θα τυπώσει το αποτέλεσμα.

Πως γίνεται αυτό;

Αν είστε κάτοχος σειριακού εκτυπωτή, ένας καλός τρόπος για να γίνει αυτό εφικτό είναι να εγκαταστήσετε το `lprps`. Το `lprps` είναι ένα φίλτρο εκτύπωσης PostScript που επικοινωνεί αμφίδρομα με τον εκτυπωτή. Ενημερώνει το αρχείο κατάστασης του εκτυπωτή με αναλυτικές πληροφορίες, ώστε οι χρήστες και οι διαχειριστές να μπορούν να δουν επακριβώς ποια είναι η κατάσταση του εκτυπωτή (όπως “`χαμηλή στάθμη toner`” ή “`πρόβλημα χαρτιού`”). Ακόμη πιο σημαντικό είναι πως περιέχει το πρόγραμμα `psif` που ανιχνεύει αν η εισερχόμενη εργασία είναι απλού κειμένου και καλεί το `textps` (ένα άλλο πρόγραμμα που περιέχεται στο `lprps`) να το μετατρέψει σε PostScript. Τέλος χρησιμοποιείται το `lprps` για να αποστείλει την εργασία στον εκτυπωτή.

Το `lprps` είναι μέρος της Συλλογής των Ports του FreeBSD (δείτε Η Συλλογή των Ports). Φυσικά, μπορείτε να το κατεβάσετε, να το μεταγλωττίσετε και να το εγκαταστήσετε μόνοι σας. Μετά την εγκατάσταση του `lprps`, απλά προσδιορίστε τη διαδρομή προς το πρόγραμμα `psif` που είναι μέρος του `lprps`. Αν εγκαταστήσατε το `lprps` από την Συλλογή των Ports, τότε για τον σειριακό σας εκτυπωτή PostScript χρησιμοποιήστε την ακόλουθη καταχώριση στο αρχείο `/etc/printcap`:

    :if=/usr/local/libexec/psif:

Θα πρέπει επίσης να καθορίσετε την ικανότητα `rw` η οποία ορίζει ότι το LPD θα χειρίζεται τον εκτυπωτή σε κατάσταση ανάγνωσης και εγγραφής.

Αν έχετε παράλληλο εκτυπωτή PostScript (και για το λόγο αυτό δεν μπορείτε να χρησιμοποιήσετε αμφίδρομη επικοινωνία με τον εκτυπωτή, όπως απαιτείται από το `lprps`), μπορείτε να χρησιμοποιήσετε το ακόλουθο shell script ως φίλτρο κειμένου:

    #!/bin/sh
    #
    #  psif - Print PostScript or plain text on a PostScript printer
    #  Script version; NOT the version that comes with lprps
    #  Installed in /usr/local/libexec/psif
    #

    IFS="" read -r first_line
    first_two_chars=`expr "$first_line" : '\(..\)'`

    if [ "$first_two_chars" = "%!" ]; then
        #
        #  PostScript job, print it.
        #
        echo "$first_line" && cat && printf "\004" && exit 0
        exit 2
    else
        #
        #  Plain text, convert it, then print it.
        #
        ( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0
        exit 2
    fi

Στο παραπάνω script, το `textps` είναι ένα πρόγραμμα που εγκαταστήσαμε ξεχωριστά για να μετατρέπουμε απλό κείμενο σε PostScript. Μπορείτε να χρησιμοποιείτε οποιοδήποτε πρόγραμμα μετατροπής από κείμενο- σε-PostScript. Η Συλλογή των Ports (δείτε Η Συλλογή των Ports) περιέχει επίσης ένα πλήρες πρόγραμμα μετατροπής από κείμενο σε PostScript, το `a2ps` που ίσως επιθυμείτε να διερευνήσετε.

### 9.4.1.3 Προσομοίωση PostScript για Εκτυπωτές που δεν το Υποστηρίζουν

Το PostScript είναι το de facto πρότυπο για στοιχειοθεσία και εκτύπωση υψηλής ποιότητας. Ωστόσο, το PostScript είναι κάπως δαπανηρό πρότυπο. Ευτυχώς, η Aladdin Enterprises παρέχει ένα παρεμφερές ελεύθερο PostScript που ονομάζεται Ghostscript και δουλεύει άψογα στο FreeBSD. Το Ghostscript διαβάζει τα περισσότερα αρχεία PostScript και μπορεί να αποδώσει τις σελίδες τους σε μεγάλη γκάμα συσκευών, συμπεριλαμβάνοντας πολλούς τύπους εκτυπωτών που δεν υποστηρίζουν PostScript. Εγκαθιστώντας το Ghostscript και χρησιμοποιώντας ένα ειδικό φίλτρο κειμένου για τον εκτυπωτή σας, μπορείτε να κάνετε τον κοινό εκτυπωτή σας να λειτουργεί σαν ένας πραγματικός εκτυπωτής PostScript.

Το Ghostscript βρίσκεται στην Συλλογή των Ports του FreeBSD, και μάλιστα σε πολλές εκδόσεις. Η πιο διαδεδομένη είναι το `print/ghostscript-gpl`.

Για να κάνετε προσομοίωση PostScript, πρέπει το φίλτρο κειμένου να ανιχνεύσει αν εκτυπώνετε αρχείο PostScript. Εάν όχι, τότε το φίλτρο θα περάσει το αρχείο κατευθείαν στον εκτυπωτή. Διαφορετικά, θα χρησιμοποιήσει το Ghostscript για να μετατρέψει αρχικά το αρχείο σε ένα τύπο που θα καταλαβαίνει ο εκτυπωτής.

Ιδού ένα παράδειγμα: το ακόλουθο script είναι ένα φίλτρο κειμένου για εκτυπωτές Hewlett Packard DeskJet 500. Για άλλους εκτυπωτές, αντικαταστήστε το όρισμα `-sDEVICE` στην εντολή `gs` (Ghostscript). (Πληκτρολογήστε `gs `-h`` για να δείτε την λίστα συσκευών που υποστηρίζει η τρέχουσα εγκατάσταση του Ghostscript.)

    #!/bin/sh
    #
    #  ifhp - Print Ghostscript-simulated PostScript on a DeskJet 500
    #  Installed in /usr/local/libexec/ifhp

    #
    #  Treat LF as CR+LF (to avoid the "staircase effect" on HP/PCL
    #  printers):
    #
    printf "\033&k2G" || exit 2

    #
    #  Read first two characters of the file
    #
    IFS="" read -r first_line
    first_two_chars=`expr "$first_line" : '\(..\)'`

    if [ "$first_two_chars" = "%!" ]; then
        #
        #  It is PostScript; use Ghostscript to scan-convert and print it.
        #
        /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \
          -sOutputFile=- - && exit 0
    else
        #
        #  Plain text or HP/PCL, so just print it directly; print a form feed
        #  at the end to eject the last page.
        #
        echo "$first_line" && cat && printf "\033&l0H" &&
    exit 0
    fi

    exit 2

Τέλος, χρειάζεται να ενημερώσετε το LPD για το φίλτρο με την ικανότητα `if`:

    :if=/usr/local/libexec/ifhp:

Αυτό είναι όλο. Μπορείτε να πληκτρολογήσετε `lpr ``plain.text``` και `lpr ``whatever.ps``` και τα δύο θα εκτυπωθούν επιτυχώς.

### 9.4.1.4 Φίλτρα Μετατροπής

Το επόμενο βήμα μετά την ολοκλήρωση της απλής εγκατάστασης που περιγράψαμε στις Βασικές Ρυθμίσεις Εκτυπωτών, είναι συνήθως η εγκατάσταση φίλτρων μετατροπής για τους τύπους αρχείων που προτιμάτε (εκτός από απλό κείμενο ASCII).

#### 9.4.1.4.1 Γιατί να εγκαταστήσετε Φίλτρα Μετατροπής;

Τα φίλτρα μετατροπής κάνουν την εκτύπωση διαφόρων τύπων αρχείων εύκολη υπόθεση. Για παράδειγμα, ας υποθέσουμε ότι έχουμε να κάνουμε αρκετή εργασία με το σύστημα στοιχειοθεσίας TeX, και ότι έχουμε εκτυπωτή PostScript. Κάθε φορά που δημιουργούμε ένα αρχείο DVI με το TeX, δεν μπορούμε να εκτυπώσουμε κατευθείαν έως ότου να μετατρέψουμε το αρχείο DVI σε PostScript. Η ακολουθία εντολών που πρέπει να ακολουθήσουμε είναι:

    % dvips seaweed-analysis.dvi
    % lpr seaweed-analysis.ps

Με την χρήση ενός φίλτρου μετατροπής για αρχεία DVI, μπορούμε να αποφύγουμε την μετατροπή που πρέπει να κάνουμε κάθε φορά χειροκίνητα, καλώντας το LPD να κάνει τη δουλειά για μας. Τώρα, κάθε φορά που έχουμε ένα αρχείο DVI, για να το τυπώσουμε χρειάζεται μόνο ένα βήμα:

    % lpr -d seaweed-analysis.dvi

Έχουμε αναθέσει στο LPD να κάνει τη μετατροπή του αρχείου DVI προσθέτοντας του την επιλογή `-d`. Η ενότητα Επιλογές Μορφοποίησης και Μετατροπής περιέχει τους πίνακες επιλογής μετατροπών.

Για κάθε επιλογή μετατροπής που θέλετε να υποστηρίζετε από ένα εκτυπωτή, πρέπει να εγκαταστήσετε ένα φίλτρο μετατροπής και να ορίσετε την διαδρομή του στο αρχείο `/etc/printcap`. Ένα φίλτρο μετατροπής είναι σαν το φίλτρο κειμένου στην απλή εγκατάσταση εκτυπωτή (δείτε την ενότητα Εγκατάσταση Φίλτρου Κειμένου) με μόνη διαφορά πως αντί το φίλτρο να εκτυπώνει απλό κείμενο, μετατρέπει το αρχείο σε μια διαφορετική μορφή ώστε να είναι κατανοητό από τον εκτυπωτή.

#### 9.4.1.4.2 Ποιο Φίλτρο Μετατροπής θα Πρέπει να Εγκαταστήσω;

Θα πρέπει να εγκαθιστάτε τα φίλτρα μετατροπής που νομίζετε πως θα χρησιμοποιήσετε. Αν εκτυπώνετε αρκετά δεδομένα DVI, τότε είναι λογικό να συμπεριλάβετε ένα φίλτρο μετατροπής DVI. Αν εκτυπώνετε συχνά δεδομένα troff, θα θέλετε να εγκαταστήσετε ένα φίλτρο troff.

Ο ακόλουθος πίνακας συνοψίζει τα φίλτρα με τα οποία συνεργάζεται το LPD, τις καταχωρίσεις της αντίστοιχης ικανότητας στο αρχείο `/etc/printcap`, και πως να τις καλέσετε μέσω της εντολής `lpr`:

Τύπος αρχείου | Ικανότητα `/etc/printcap` | Παράμετρος εντολής `lpr`
--- | --- | ---
cifplot | `cf` | `-c`
DVI | `df` | `-d`
plot | `gf` | `-g`
ditroff | `nf` | `-n`
FORTRAN text | `rf` | `-f`
troff | `tf` | `-f`
raster | `vf` | `-v`
plain text | `if` | none, `-p`, or `-l`

Στο παράδειγμα μας, αν χρησιμοποιήσουμε `lpr `-d`` σημαίνει ότι ο εκτυπωτής χρειάζεται την ικανότητα `df` στην καταχώριση του στο `/etc/printcap`.

Αν και κάποιοι μπορεί να ισχυριστούν το αντίθετο, μερικοί τύποι αρχείων όπως είναι τα κείμενα και γραφικά FORTRAN είναι ξεπερασμένα. Μπορείτε να δώσετε νέα πνοή σε αρχεία αυτού του τύπου (ή και οποιασδήποτε άλλης μορφής εξόδου), εγκαθιστώντας προσαρμοσμένα φίλτρα. Για παράδειγμα, ας υποθέσουμε ότι θα θέλατε να εκτυπώσετε κατευθείαν αρχεία Printerleaf (αρχεία προερχόμενα από το πρόγραμμα επιτραπέζιας τυπογραφίας Interleaf), αλλά δεν θα εκτυπώσετε ποτέ διαγράμματα (plots). Θα μπορούσατε να εγκαταστήσετε ένα φίλτρο μετατροπής αρχείων Printerleaf υπό την ικανότητα `gf` και να εκπαιδεύσετε τους χρήστες σας ότι η εντολή `lpr `-g`` σημαίνει «τύπωσε αρχεία Printerleaf.»

#### 9.4.1.4.3 Εγκατάσταση Φίλτρων Μετατροπών

Από τη στιγμή που τα φίλτρα μετατροπής είναι προγράμματα που δεν ανήκουν στο βασικό σύστημα εγκατάστασης του FreeBSD, είναι πιο σωστό να εγκατασταθούν στον κατάλογο `/usr/local`. Ένας συνήθης προορισμός των προγραμμάτων αυτών είναι ο κατάλογος `/usr/local/libexec`, μια που πρόκειται για εξειδικευμένα προγράμματα που εκτελούνται μόνο από το LPD. Οι απλοί χρήστες δεν θα χρειαστεί ποτέ να τα εκτελέσουν.

Για να ενεργοποιήσετε ένα φίλτρο μετατροπής, προσδιορίστε τη διαδρομή του στο αρχείο `/etc/printcap`, αλλάζοντας την κατάλληλη ικανότητα στον εκτυπωτή που επιθυμείτε να το χρησιμοποιήσετε.

Στο παράδειγμα μας, θα προσθέσουμε το φίλτρο μετατροπής DVI στην καταχώριση μας για τον εκτυπωτή με το όνομα `bamboo`. Ακολουθεί, λοιπόν, το παράδειγμα για το αρχείο `/etc/printcap`, με την νέα ικανότητα `df` για τον εκτυπωτή `bamboo`:

    #
    #  /etc/printcap for host rose - added df filter for bamboo
    #
    rattan|line|diablo|lp|Diablo 630 Line Printer:\
            :sh:sd=/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/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
            :if=/usr/local/libexec/psif:\
            :df=/usr/local/libexec/psdf:

Το φίλτρο DVI είναι ένα shell script που ονομάζεται `/usr/local/libexec/psdf`, το οποίο και παραθέτουμε παρακάτω:

    #!/bin/sh
    #
    #  psdf - DVI to PostScript printer filter
    #  Installed in /usr/local/libexec/psdf
    #
    # Invoked by lpd when user runs lpr -d
    #
    exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"

Αυτό το script τρέχει το `dvips` σε κατάσταση φίλτρου (με την παράμετρο `-f`) στην standard input, από όπου και λαμβάνει την εργασία προς εκτύπωση. Αυτό ξεκινά το φίλτρο εκτύπωσης PostScript `lprps` (δείτε την ενότητα Συμβατότητα Εργασιών Απλού Κειμένου σε εκτυπωτές PostScript) δίνοντας του και τις παραμέτρους που πέρασε το LPD στο παραπάνω script. Το `lprps` θα χρησιμοποιήσει αυτές τις παραμέτρους για την καταμέτρηση των εκτυπωμένων σελίδων.

#### 9.4.1.4.4 Ακόμα μερικά Παραδείγματα Φίλτρων Μετατροπής

Από τη στιγμή που δεν υπάρχει αυτοματοποιημένη μέθοδος για την εγκατάσταση των φίλτρων μετατροπής, ας μας επιτραπεί να παρέχουμε μερικά ακόμη παραδείγματα. Μπορείτε να τα χρησιμοποιήσετε σαν οδηγό για την δημιουργία των δικών σας φίλτρων. Αν νομίζετε πως είναι κατάλληλα για την περίπτωση σας μπορείτε να τα χρησιμοποιήσετε και κατευθείαν.

Αυτό το παράδειγμα script είναι ένα φίλτρο μετατροπής ράστερ (αρχείου GIF για την ακρίβεια) για έναν εκτυπωτή Hewlett Packard LaserJet III-Si:

    #!/bin/sh
    #
    #  hpvf - Convert GIF files into HP/PCL, then print
    #  Installed in /usr/local/libexec/hpvf

    PATH=/usr/X11R6/bin:$PATH; export PATH
    giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
        && exit 0 \
        || exit 2

Δουλεύει ως εξής: μετατρέπει το αρχείο GIF σε ένα γενικό φορητό τύπο anymap, εν συνεχεία το μετατρέπει σε ένα φορητό τύπο graymap, έπειτα σε ένα φορητό τύπο bitmap, και τέλος το μετατρέπει σε δεδομένα συμβατά με PCL για τον LaserJet.

Εδώ είναι το αρχείο `/etc/printcap` με μια καταχώριση για έναν εκτυπωτή που χρησιμοποιεί το παραπάνω φίλτρο:

    #
    #  /etc/printcap for host orchid
    #
    teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
            :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
            :if=/usr/local/libexec/hpif:\
            :vf=/usr/local/libexec/hpvf:

Το ακόλουθο script είναι ένα φίλτρο μετατροπής δεδομένων troff από το σύστημα στοιχειοθεσίας groff για τον εκτυπωτή PostScript με όνομα `bamboo`:

    #!/bin/sh
    #
    #  pstf - Convert groff's troff data into PS, then print.
    #  Installed in /usr/local/libexec/pstf
    #
    exec grops | /usr/local/libexec/lprps "$@"

Το παραπάνω script χρησιμοποιεί πάλι το `lprps` για να χειριστεί την επικοινωνία με τον εκτυπωτή. Αν ο εκτυπωτής ήταν σε παράλληλη πόρτα τότε θα είχαμε, αντιθέτως, χρησιμοποιήσει το ακόλουθο script:

    #!/bin/sh
    #
    #  pstf - Convert groff's troff data into PS, then print.
    #  Installed in /usr/local/libexec/pstf
    #
    exec grops

Εδώ είναι η καταχώριση που χρειάζεται να προσθέσουμε στο `/etc/printcap` για να ενεργοποιήσουμε το φίλτρο:

    :tf=/usr/local/libexec/pstf:

Εδώ είναι ένα παράδειγμα που μας επιτρέπει να εκτυπώσουμε παλαιό κώδικα της FORTRAN. Είναι ένα φίλτρο κειμένου για FORTRAN για οποιονδήποτε εκτυπωτή μπορεί να εκτυπώσει κατευθείαν απλό κείμενο. Θα το εγκαταστήσουμε για έναν εκτυπωτή που ονομάζεται `teak`:

    #!/bin/sh
    #
    # hprf - FORTRAN text filter for LaserJet 3si:
    # Installed in /usr/local/libexec/hprf
    #

    printf "\033&k2G" && fpr && printf "\033&l0H" &&
     exit 0
    exit 2

Και θα προσθέσουμε αυτή τη γραμμή στο `/etc/printcap` για να ενεργοποιήσουμε το φίλτρο για τον εκτυπωτή `teak`:

    :rf=/usr/local/libexec/hprf:

Και ένα τελευταίο κάπως περίπλοκο παράδειγμα: Θα προσθέσουμε ένα φίλτρο DVI στον εκτυπωτή LaserJet `teak` που αναφέραμε προηγούμενα. Καταρχήν το εύκολο μέρος: αναβαθμίζουμε το `/etc/printcap` με την τοποθεσία όπου βρίσκεται το φίλτρο DVI:

    :df=/usr/local/libexec/hpdf:

Τώρα, το δύσκολο μέρος: η κατασκευή του φίλτρου. Θα χρειαστούμε ένα πρόγραμμα μετατροπής από DVI-σε-LaserJet/PCL. Στην Συλλογή των Ports του FreeBSD (δείτε Συλλογή των Ports) υπάρχει ένα τέτοιο πρόγραμμα: Το όνομα του πακέτου είναι `dvi2xx`. Η εγκατάσταση του πακέτου, μας παρέχει ακριβώς το πρόγραμμα που χρειαζόμαστε, το `dvilj2p`, το οποίο μετατρέπει τον κώδικα DVI σε κώδικα συμβατό με LaserJet IIp, LaserJet III, και LaserJet 2000.

Το `dvilj2p` κάνει το φίλτρο `hpdf` αρκετά περίπλοκο από τη στιγμή που το `dvilj2p` δε μπορεί να διαβάσει από το standard input. Χρειάζεται να δουλέψει με κάποιο όνομα αρχείου. Ακόμη χειρότερα, το όνομα του αρχείου πρέπει να τελειώνει σε `.dvi` κι επομένως η χρήση του `/dev/fd/0` ως standard input είναι προβληματική. Θα μπορούσαμε να αντιμετωπίσουμε το πρόβλημα δημιουργώντας (συμβολικούς) δεσμούς με κάποιο προσωρινό όνομα αρχείου (που να τελειώνει σε `.dvi`) για το `/dev/fd/0`, και με αυτό τον τρόπο να εξαναγκάσουμε το `dvilj2p` να διαβάζει από το standard input.

Ακόμη ένα πρόβλημα που προκύπτει είναι το γεγονός πως δεν μπορούμε να χρησιμοποιήσουμε το `/tmp` για τον προσωρινό δεσμό. Οι συμβολικοί δεσμοί ανήκουν στον χρήστη και στην ομάδα `bin`, ενώ το φίλτρο τρέχει σαν χρήστης `daemon`. Επίσης στον κατάλογο `/tmp` είναι ενεργό το sticky bit. Το φίλτρο μπορεί να δημιουργήσει το δεσμό, αλλά δεν θα είναι ικανό να τον εξαλείψει και να τον αφαιρέσει από τη στιγμή που αυτός θα ανήκει σε διαφορετικό χρήστη.

Αντίθετα, το φίλτρο θα φτιάξει το συμβολικό link στον τρέχοντα κατάλογο, που είναι ο κατάλογος παροχέτευσης (spooling) (και που προσδιορίζεται από την ικανότητα `sd` στο `/etc/printcap`). Αυτό είναι το τέλειο μέρος για να δουλεύουν τα φίλτρα, ειδικά λόγω του ότι (μερικές φορές) υπάρχει περισσότερες ελεύθερος χώρος στο δίσκο στον κατάλογο παροχέτευσης (spool) από ότι στο `/tmp`.

Και τελικά, ιδού το φίλτρο:

    #!/bin/sh
    #
    #  hpdf - Print DVI data on HP/PCL printer
    #  Installed in /usr/local/libexec/hpdf

    PATH=/usr/local/bin:$PATH; export PATH

    #
    #  Define a function to clean up our temporary files.  These exist
    #  in the current directory, which will be the spooling directory
    #  for the printer.
    #
    cleanup() {
       rm -f hpdf$$.dvi
    }

    #
    #  Define a function to handle fatal errors: print the given message
    #  and exit 2.  Exiting with 2 tells LPD to do not try to reprint the
    #  job.
    #
    fatal() {
        echo "$@" 1>&2
        cleanup
        exit 2
    }

    #
    #  If user removes the job, LPD will send SIGINT, so trap SIGINT
    #  (and a few other signals) to clean up after ourselves.
    #
    trap cleanup 1 2 15

    #
    #  Make sure we are not colliding with any existing files.
    #
    cleanup

    #
    #  Link the DVI input file to standard input (the file to print).
    #
    ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"

    #
    #  Make LF = CR+LF
    #
    printf "\033&k2G" || fatal "Cannot initialize printer"

    #
    #  Convert and print.  Return value from dvilj2p does not seem to be
    #  reliable, so we ignore it.
    #
    dvilj2p -M1 -q -e- dfhp$$.dvi

    #
    #  Clean up and exit
    #
    cleanup
    exit 0

#### 9.4.1.4.5 Αυτοματοποιημένες Μετατροπές: Μία Εναλλακτική στα Φίλτρα Μετατροπής

Όλα τα φίλτρα μετατροπής μπορεί να πληρούν το περιβάλλον εκτυπώσεων σας, αλλά υποχρεώνουν τον χρήστη να προσδιορίζει (στην γραμμή εντολών του lpr(1)) ποιό από αυτά θα χρησιμοποιηθεί. Αν οι χρήστες σας δεν είναι ιδιαίτερα εξοικειωμένοι με τους Η/Υ, το να πρέπει να αναφέρουν κάθε φορά ένα φίλτρο πιθανώς να είναι ενοχλητικό. Είναι ακόμα χειρότερο ωστόσο να γίνει λανθασμένη επιλογή φίλτρου, το οποίο θα εκτελεστεί σε ακατάλληλο για αυτό τύπο αρχείου, και θα προκαλέσει την σπατάλη εκατοντάδων σελίδων χαρτιού.

Αντί να εγκαταστήσετε οποιοδήποτε φίλτρο μετατροπής, μπορεί να θέλετε να δοκιμάσετε να έχετε ένα φίλτρο κειμένου (αφού είναι το προεπιλεγμένο φίλτρο) που να ανιχνεύει τον τύπο του αρχείου που έχει ζητηθεί να εκτυπωθεί και να εκτελεί αυτόματα το κατάλληλο φίλτρο μετατροπής. Εργαλεία σαν το `file` μπορούν να σας βοηθήσουν. Μπορεί να είναι δύσκολο να προσδιοριστούν οι διαφορές μεταξύ κάποιων τύπων αρχείων--αλλά, φυσικά, μπορείτε πάντα να παρέχετε φίλτρα μετατροπής ειδικά για αυτές τις περιπτώσεις.

Η Συλλογή των Ports του FreeBSD έχει ένα φίλτρο κειμένου που εκτελεί αυτόματες μετατροπές και ονομάζεται `apsfilter`. Μπορεί να ανιχνεύει απλό κείμενο, PostScript, DVI και σχεδόν οποιοδήποτε τύπο αρχείου, να εκτελεί την κατάλληλη μετατροπή, και να εκτυπώνει.

### 9.4.1.5 Φίλτρα Εξόδου

Το σύστημα παροχέτευσης LPD υποστηρίζει έναν ακόμη τύπο φίλτρου που ίσως να μην έχετε εξερευνήσει ακόμα: το φίλτρο εξόδου. Το φίλτρο εξόδου προορίζεται μόνο για εκτύπωση απλού κειμένου, όπως το φίλτρο κειμένου, αλλά με πολλές απλοποιήσεις. Εάν χρησιμοποιείτε φίλτρο εξόδου αλλά όχι φίλτρο κειμένου, τότε:

- Το LPD ξεκινά ένα φίλτρο εξόδου μόνο μια φορά για όλη την εργασία, αντί ένα χωριστό για κάθε αρχείο της εργασίας.

- Το LPD δεν φροντίζει να αναγνωρίσει την αρχή ή το τέλος των αρχείων μέσα στην ίδια την εργασία όταν χρησιμοποιείται το φίλτρο εξόδου.

- Το LPD δεν περνάει στο φίλτρο τα δεδομένα εισόδου του χρήστη ή το όνομα του μηχανήματος, επομένως δεν προορίζεται για καταμέτρηση εκτυπωμένων σελίδων. Το φίλτρο εξόδου δέχεται μόνος τις παραμέτρους:

  `filter-name` -w`width` -l`length`

  Όπου το `width` είναι από την ικανότητα `pw` και το `length` είναι από την ικανότητα `pl` για τον συγκεκριμένο εκτυπωτή.

Μην παρασύρεστε από την απλότητα του φίλτρου εξόδου. Αν επιθυμείτε κάθε αρχείο μιας εργασίας να ξεκινά σε μια νέα σελίδα, το φίλτρο εξόδου δεν κάνει για σας. Χρησιμοποιήστε ένα φίλτρο κειμένου (γνωστό και ως φίλτρο εισόδου). Δείτε την ενότητα Εγκατάσταση Φίλτρου Κειμένου. Επιπλέον, ένα φίλτρο εξόδου είναι στην πραγματικότητα πιο περίπλοκο αφού πρέπει να εξετάζει την ροή των byte που αποστέλλεται προς αυτό για ειδικούς χαρακτήρες flag και πρέπει να στέλνει σήματα στον εαυτό του για λογαριασμό του LPD.

Ωστόσο, ένα φίλτρο εξόδου είναι αναγκαίο αν θέλετε σελίδες κεφαλίδας και χρειάζεται να στέλνετε ακολουθίες διαφυγής ή άλλες ακολουθίες αρχικοποίησης προκειμένου να τις εκτυπώσετε. (Αλλά είναι επίσης μάταιο αν θέλετε να χρεώνετε σελίδες κεφαλίδας στον λογαριασμό του αντίστοιχου χρήστη, από τη στιγμή που το LPD δεν στέλνει καμιά πληροφορία για τον χρήστη ή τον υπολογιστή στο φίλτρο εξόδου.)

Το LPD επιτρέπει την συνύπαρξη ενός φίλτρου εξόδου και άλλων φίλτρων (κειμένου ή διαφορετικού τύπου) στον ίδιο εκτυπωτή. Σε αυτές τις περιπτώσεις, το LPD θα ξεκινά το φίλτρο εξόδου μόνο για την εκτύπωση της σελίδας κεφαλίδας (δείτε την ενότητα Σελίδες Κεφαλίδας). Το LPD θα αναμένει το φίλτρο εξόδου να σταματήσει από μόνο του όταν του στείλει δύο bytes: ένα ASCII 031 ακολουθούμενο από ένα ASCII 001. Όταν ένα φίλτρο εξόδου βλέπει αυτά τα δύο bytes (031, 001), θα πρέπει να σταματά στέλνοντας σήμα `SIGSTOP` στον εαυτό του. Όταν το LPD ολοκληρώσει την εκτέλεση και των υπολοίπων φίλτρων, θα επανεκκινήσει το φίλτρο εξόδου στέλνοντας του το σήμα `SIGCONT`.

Αν υπάρχει φίλτρο εξόδου, αλλά δεν υπάρχει φίλτρο κειμένου και το LPD δουλεύει σε εργασία απλού κειμένου, το LPD χρησιμοποιεί το φίλτρο εξόδου για την εκτέλεση της εργασίας. Όπως αναφέραμε και παραπάνω, το φίλτρο εξόδου θα εκτυπώσει κάθε αρχείο εργασίας στη σειρά, δίχως δυνατότητα παρεμβολής κενής σελίδας ή άλλων ρυθμίσεων στην τροφοδοσία χαρτιού, και πιθανώς αυτό να μην είναι επιθυμητό. Σχεδόν σε όλες τις περιπτώσεις, θα χρειαστείτε ένα φίλτρο κειμένου.

Το πρόγραμμα `lpf`, που αναφέραμε νωρίτερα σαν φίλτρο κειμένου, μπορεί να τρέξει και σαν φίλτρο εξόδου. Αν χρειάζεστε ένα γρήγορο φίλτρο εξόδου αλλά δεν θέλετε να γράψετε τον κώδικα ανίχνευσης των byte και τον κώδικα αποστολής σημάτων, δοκιμάστε το `lpf`. Μπορείτε επίσης να χρησιμοποιήσετε το `lpf` μέσα από ένα shell script το οποίο θα χειρίζεται τους κωδικούς αρχικοποίησης που ίσως να χρειάζεται ο εκτυπωτής.

### 9.4.1.6 `lpf`: ένα Φίλτρο Κειμένου

Το πρόγραμμα `/usr/libexec/lpr/lpf` που παρέχεται με τη διανομή εκτελέσιμων του FreeBSD είναι ένα φίλτρο κειμένου (φίλτρο εισόδου) που μπορεί να παραγραφοποιεί την έξοδο (εργασίες που έχουν σταλεί με `lpr `-i``), να επιτρέπει την διέλευση literal χαρακτήρων (εργασίες που έχουν σταλεί με `lpr `-l``), να ρυθμίζει την θέση εκτύπωσης με τη χρήση χαρακτήρων backspace και tab στην εργασία, και να κάνει καταμέτρηση των εκτυπωμένων σελίδων. Επίσης μπορεί να ενεργεί και σαν φίλτρο εξόδου.

Το `lpf` είναι κατάλληλο για διάφορα περιβάλλοντα εκτύπωσης. Αν και δεν έχει δυνατότητα αποστολής ακολουθιών αρχικοποίησης στον εκτυπωτή, είναι εύκολο να γράψετε ένα shell script για να κάνετε την απαραίτητη αρχικοποίηση και να εκτελέσετε έπειτα το `lpf`.

Για να κάνει σωστά καταμέτρηση σελίδων, το `lpf` χρειάζεται κατάλληλες τιμές για τις ικανότητες `pw` και `pl` στο αρχείο `/etc/printcap`. Χρησιμοποιεί αυτές τις τιμές για να προσδιορίσει πόσο κείμενο μπορεί να χωρέσει σε μία σελίδα και από πόσες σελίδες αποτελείται η εργασία του χρήστη. Για περισσότερες πληροφορίες σχετικά με την καταμέτρηση σελίδων, συμβουλευτείτε την Καταμέτρηση Χρήσης Εκτυπωτών.

## 9.4.2 Σελίδες Κεφαλίδας

Αν έχετε αρκετούς χρήστες, και όλοι τους χρησιμοποιούν διάφορους εκτυπωτές, τότε πιθανώς να θεωρείτε τις σελίδες κεφαλίδας ως αναγκαίο κακό.

Οι σελίδες κεφαλίδας, γνωστές επίσης και ως banner ή σελίδες burst αναγνωρίζουν σε ποιον ανήκουν οι εργασίες μετά την εκτύπωση τους. Συνήθως τυπώνονται με μεγάλα, έντονα γράμματα, και ίσως με διακοσμητικά περιγράμματα, ώστε σε μια στοίβα εκτυπώσεων να ξεχωρίζουν από τα πραγματικά έγγραφα εργασιών των χρηστών. Επιτρέπουν έτσι στους χρήστες να βρίσκουν γρήγορα τις εργασίες τους. Το προφανές μειονέκτημα σε μια σελίδα κεφαλίδας είναι πως πρόκειται να εκτυπωθεί μια ακόμα σελίδα για κάθε μία εργασία. Η εφήμερη χρησιμότητα τους διαρκεί λίγα λεπτά, και ο προορισμός τους είναι ο κάδος αχρήστων/ανακύκλωσης. (Παρατηρήστε πως οι σελίδες κεφαλίδας είναι ανά εργασία, και όχι ανά αρχείο σε μια εργασία, επομένως το αχρηστευμένο χαρτί ίσως να μην είναι τόσο πολύ).

Το σύστημα LPD μπορεί να παρέχει αυτόματα σελίδες κεφαλίδας για τις εκτυπώσεις σας, αν ο εκτυπωτής σας μπορεί να εκτυπώσει άμεσα απλό κείμενο. Αν έχετε εκτυπωτή PostScript, θα χρειαστείτε ένα εξωτερικό πρόγραμμα για να δημιουργήσετε την σελίδα κεφαλίδας. Δείτε το Σελίδες Κεφαλίδας σε Εκτυπωτές PostScript.

### 9.4.2.1 Ενεργοποίηση Σελίδων Κεφαλίδας

Στην ενότητα Βασικές Ρυθμίσεις Εκτυπωτών, απενεργοποιήσαμε τις σελίδες κεφαλίδας με την καταχώριση `sh` (σημαίνει «suppress header») στο αρχείο `/etc/printcap`. Για να ενεργοποιήσετε τις σελίδες κεφαλίδας για κάποιον εκτυπωτή, απλά αφαιρέστε την ικανότητα `sh`.

Ακούγεται εύκολο, δεν νομίζετε;

Έτσι είναι. Ίσως χρειαστεί να παρέχετε ένα φίλτρο εξόδου για να στείλετε εντολές αρχικοποίησης στον εκτυπωτή. Εδώ είναι ένα παράδειγμα φίλτρου εξόδου για εκτυπωτές συμβατούς με τον τύπο PCL της Hewlett Packard:

    #!/bin/sh
    #
    #  hpof - Output filter for Hewlett Packard PCL-compatible printers
    #  Installed in /usr/local/libexec/hpof

    printf "\033&k2G" || exit 2
    exec /usr/libexec/lpr/lpf

Προσδιορίστε την διαδρομή προς το φίλτρο εξόδου στην ικανότητα `of`. Δείτε την ενότητα Φίλτρα Εξόδου για περισσότερες πληροφορίες.

Εδώ είναι ένα παράδειγμα αρχείου `/etc/printcap` για τον εκτυπωτή `teak` από το προηγούμενο παράδειγμα. Ενεργοποιήσαμε τις σελίδες κεφαλίδας και προσθέσαμε το παραπάνω φίλτρο εξόδου:

    #
    #  /etc/printcap for host orchid
    #
    teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
            :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
            :if=/usr/local/libexec/hpif:\
            :vf=/usr/local/libexec/hpvf:\
            :of=/usr/local/libexec/hpof:

Τώρα, όταν οι χρήστες εκτυπώνουν εργασίες στον `teak`, θα παίρνουν και μία σελίδα κεφαλίδας ανά εργασία. Αν οι χρήστες θέλουν να ξοδεύουν χρόνο ψάχνοντας για τις εκτυπώσεις τους, μπορούν να παρεμποδίσουν τις σελίδες κεφαλίδας αποστέλλοντας τις εργασίες τους με `lpr `-h``. Δείτε την ενότητα Επιλογές Σελίδων Κεφαλίδας για περισσότερες επιλογές του lpr(1).

> Σημείωση: Το LPD στέλνει το χαρακτήρα αλλαγής σελίδας (form feed) αμέσως μετά τη σελίδα κεφαλίδας. Αν ο εκτυπωτής σας χρησιμοποιεί διαφορετικό χαρακτήρα ή ακολουθία χαρακτήρων για την αλλαγή σελίδας, προσδιορίστε τα με την ικανότητα `ff` στο αρχείο `/etc/printcap`.

### 9.4.2.2 Έλεγχος Σελίδων Κεφαλίδας

Μετά την ενεργοποίηση των σελίδων κεφαλίδας, το LPD θα παράγει μία επιμήκη κεφαλίδα, μία ολόκληρη σελίδα με μεγάλα γράμματα που προσδιορίζει τον χρήστη, τον υπολογιστή (host), και την εργασία. Εδώ είναι ένα παράδειγμα (η `kelly` εκτύπωσε την εργασία με όνομα «outline» από τον υπολογιστή `rose`):

          k                   ll       ll
          k                    l        l
          k                    l        l
          k   k     eeee       l        l     y    y
          k  k     e    e      l        l     y    y
          k k      eeeeee      l        l     y    y
          kk k     e           l        l     y    y
          k   k    e    e      l        l     y   yy
          k    k    eeee      lll      lll     yyy y
                                                   y
                                              y    y
                                               yyyy

                                       ll
                              t         l        i
                              t         l
           oooo    u    u   ttttt       l       ii     n nnn     eeee
          o    o   u    u     t         l        i     nn   n   e    e
          o    o   u    u     t         l        i     n    n   eeeeee
          o    o   u    u     t         l        i     n    n   e
          o    o   u   uu     t  t      l        i     n    n   e    e
           oooo     uuu u      tt      lll      iii    n    n    eeee

          r rrr     oooo     ssss     eeee
          rr   r   o    o   s    s   e    e
          r        o    o    ss      eeeeee
          r        o    o      ss    e
          r        o    o   s    s   e    e
          r         oooo     ssss     eeee

                                                  Job:  outline
                                                  Date: Sun Sep 17 11:04:58 1995

Το LPD προσθέτει μια εντολή αλλαγής σελίδας (form feed) μετά από αυτό το κείμενο έτσι ώστε η εργασία να ξεκινήσει σε νέα σελίδα (εκτός αν έχετε προσδιορίσει την ικανότητα `sf` (suppress form feeds) για τον εκτυπωτή στο αρχείο `/etc/printcap`).

Αν προτιμάτε, το LPD μπορεί να φτιάξει μια μικρότερου μήκους κεφαλίδα. Προσδιορίστε `sb` (short banner) στο αρχείο `/etc/printcap`. Η σελίδα κεφαλίδας θα μοιάζει σαν αυτή:

    rose:kelly  Job: outline  Date: Sun Sep 17 11:07:51 1995

Το LPD τυπώνει (από προεπιλογή) πρώτα την σελίδα κεφαλίδας, και μετά την εργασία. Για να αντιστρέψετε την σειρά, χρησιμοποιήστε την ικανότητα `hl` (header last) στο αρχείο `/etc/printcap`.

### 9.4.2.3 Καταμέτρηση με Σελίδες Κεφαλίδας

Η χρήση των προεγκατεστημένων σελίδων κεφαλίδας του LPD ουσιαστικά υποχρεώνουν την τήρηση του παρακάτω κανόνα όταν κάνουμε καταμέτρηση χρήσης του εκτυπωτή: Οι σελίδες κεφαλίδας πρέπει να διατίθενται ελεύθερα (δίχως χρέωση).

Γιατί;

Διότι το φίλτρο εξόδου είναι το μοναδικό εξωτερικό πρόγραμμα που έχει τον έλεγχο στην εκτύπωση της κεφαλίδας και θα μπορούσε να κάνει καταμέτρηση, αλλά ωστόσο δεν παρέχει καμία πληροφορία για τον χρήστη ή τον υπολογιστή ή κάποιο άλλο αρχείο καταμέτρησης, επομένως δεν γνωρίζει σε ποιόν να αποδώσει την χρήση του εκτυπωτή. Δεν αρκεί απλά να «προσθέσετε μία ακόμη σελίδα στην καταμέτρηση» τροποποιώντας το φίλτρο κειμένου ή οποιοδήποτε άλλο φίλτρο μετατροπής (το οποίο διαθέτει τις πληροφορίες χρήστη και υπολογιστή), από τη στιγμή που οι χρήστες έχουν την δυνατότητα να παρεμποδίσουν τις σελίδες κεφαλίδας με `lpr `-h``. Θα μπορούσαν πάλι να χρεωθούν για σελίδες κεφαλίδας που δεν εκτύπωσαν. Βασικά, η `lpr `-h`` θα είναι η προτιμώμενη επιλογή σε ένα περιβάλλον που οι χρήστες έχουν οικολογική συνείδηση, αλλά δεν μπορείτε πραγματικά να παροτρύνετε οποιονδήποτε να τη χρησιμοποιήσει.

Δεν είναι αρκετό απλά κάθε φίλτρο σας να δημιουργεί τη δικιά του σελίδα κεφαλίδας (έτσι ώστε να μπορεί να χρεώνει με αυτό τον τρόπο). Αν οι χρήστες επιθυμούν την επιλογή παρεμπόδισης των σελίδων κεφαλίδας με `lpr `-h``, θα συνεχίσουν να τις παραλαμβάνουν - και να χρεώνονται για αυτές - αφού το LPD δεν έχει δυνατότητα να περάσει σε οποιοδήποτε φίλτρο την επιλογή `-h`.

Επομένως, ποιες επιλογές έχετε;

Μπορείτε:

- Να αποδεχθείτε την υπόδειξη του LPD και να παρέχετε τις σελίδες κεφαλίδας ελεύθερα.

- Να εγκαταστήσετε εναλλακτικές λύσεις αντί του LPD, όπως το LPRng. Η ενότητα Εναλλακτικές Λύσεις για τον Στάνταρ Spooler δίνει περισσότερες πληροφορίες για άλλες εφαρμογές παροχέτευσης που μπορείτε να χρησιμοποιήσετε αντί για το LPD.

- Να γράψετε ένα έξυπνο φίλτρο εξόδου. Υπό κανονικές συνθήκες, ένα "φίλτρο εξόδου" δεν κάνει τίποτε παραπάνω από την αρχικοποίηση ενός εκτυπωτή ή μερικές απλές μετατροπές χαρακτήρων. Είναι κατάλληλο για σελίδες κεφαλίδας και για εργασίες απλού κειμένου (όταν δεν υπάρχει φίλτρο (εισόδου) κειμένου). Αλλά αν υπάρχει φίλτρο κειμένου για εργασίες απλού κειμένου, τότε το LPD θα ενεργοποιεί το φίλτρο εξόδου μόνο για τις σελίδες κεφαλίδας. Και το φίλτρο εξόδου μπορεί να αναλύει το κείμενο της σελίδας κεφαλίδας που δημιουργεί το LPD για να προσδιορίζει τον χρήστη και τον υπολογιστή, ώστε να χρεώνει τις σελίδες κεφαλίδας. Το μόνο επιπλέον πρόβλημα με αυτή τη μέθοδο είναι πως το φίλτρο εξόδου εξακολουθεί να μη γνωρίζει ποιό αρχείο καταμέτρησης να χρησιμοποιήσει (δεν του έχει δοθεί το όνομα του αρχείου από την ικανότητα `af`), αλλά αν το όνομα του αρχείου σας είναι γνωστό, μπορείτε να το ενσωματώσετε απευθείας στον κώδικα του φίλτρου εξόδου. Για να διευκολύνετε την διαδικασία ανάλυσης, χρησιμοποιήστε την ικανότητα `sh` (short header) στο `/etc/printcap`. Ίσως πάλι όλα αυτά να είναι υπερβολικά κοπιαστικά, ενώ είναι σίγουρο πως οι χρήστες θα εκτιμήσουν τον γενναιόδωρο διαχειριστή συστήματος που επιτρέπει ελεύθερα τις σελίδες κεφαλίδας.

### 9.4.2.4 Σελίδες Κεφαλίδας σε Εκτυπωτές PostScript

Όπως περιγράψαμε παραπάνω, το LPD μπορεί να δημιουργήσει μία σελίδα κεφαλίδας απλού κειμένου, κατάλληλη για πολλούς εκτυπωτές. Οι εκτυπωτές PostScript, φυσικά, δεν μπορούν να τυπώσουν κατευθείαν απλό κείμενο, επομένως αυτή η δυνατότητα του LPD για τις σελίδες κεφαλίδας είναι άχρηστη σε αυτή την περίπτωση.

Ένας προφανής τρόπος να παρέχονται σελίδες κεφαλίδας είναι να δημιουργούνται από κάθε φίλτρο μετατροπής και το φίλτρο κειμένου. Τα φίλτρα θα πρέπει να δέχονται ως παραμέτρους το όνομα του χρήστη και του υπολογιστή ώστε να δημιουργούν την κατάλληλη σελίδα κεφαλίδας. Το μειονέκτημα αυτής της μεθόδου είναι πως οι χρήστες θα εκτυπώνουν πάντα σελίδα κεφαλίδας, ακόμη κι αν αποστέλλουν την εργασία τους με `lpr `-h``.

Επιτρέψτε μας να εξερευνήσουμε αυτή τη μέθοδο. Το ακόλουθο script δέχεται τρεις παραμέτρους (το όνομα χρήστη - login name, το όνομα του υπολογιστή - host name, και το όνομα εργασίας) και δημιουργεί μία απλή σελίδα κεφαλίδας PostScript:

    #!/bin/sh
    #
    #  make-ps-header - make a PostScript header page on stdout
    #  Installed in /usr/local/libexec/make-ps-header
    #

    #
    #  These are PostScript units (72 to the inch).  Modify for A4 or
    #  whatever size paper you are using:
    #
    page_width=612
    page_height=792
    border=72

    #
    #  Check arguments
    #
    if [ $# -ne 3 ]; then
        echo "Usage: `basename $0` <user> <host> <job>" 1>&2
        exit 1
    fi

    #
    #  Save these, mostly for readability in the PostScript, below.
    #
    user=$1
    host=$2
    job=$3
    date=`date`

    #
    #  Send the PostScript code to stdout.
    #
    exec cat <<EOF
    %!PS

    %
    %  Make sure we do not interfere with user's job that will follow
    %
    save

    %
    %  Make a thick, unpleasant border around the edge of the paper.
    %
    $border $border moveto
    $page_width $border 2 mul sub 0 rlineto
    0 $page_height $border 2 mul sub rlineto
    currentscreen 3 -1 roll pop 100 3 1 roll setscreen
    $border 2 mul $page_width sub 0 rlineto closepath
    0.8 setgray 10 setlinewidth stroke 0 setgray

    %
    %  Display user's login name, nice and large and prominent
    %
    /Helvetica-Bold findfont 64 scalefont setfont
    $page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto
    ($user) show

    %
    %  Now show the boring particulars
    %
    /Helvetica findfont 14 scalefont setfont
    /y 200 def
    [ (Job:) (Host:) (Date:) ] {
    200 y moveto show /y y 18 sub def }
    forall

    /Helvetica-Bold findfont 14 scalefont setfont
    /y 200 def
    [ ($job) ($host) ($date) ] {
            270 y moveto show /y y 18 sub def
    } forall

    %
    % That is it
    %
    restore
    showpage
    EOF

Τώρα, καθένα από τα φίλτρα μετατροπής και το φίλτρο κειμένου μπορούν να καλέσουν το script, πρώτα για να δημιουργήσουν τη σελίδα κεφαλίδας, και έπειτα για να εκτυπώσουν την εργασία του χρήστη. Ακολουθεί το φίλτρο μετατροπής DVI που δείξαμε νωρίτερα, ειδικά διαμορφωμένο για να φτιάξουμε μια σελίδα κεφαλίδας:

    #!/bin/sh
    #
    #  psdf - DVI to PostScript printer filter
    #  Installed in /usr/local/libexec/psdf
    #
    #  Invoked by lpd when user runs lpr -d
    #

    orig_args="$@"

    fail() {
        echo "$@" 1>&2
        exit 2
    }

    while getopts "x:y:n:h:" option; do
        case $option in
            x|y)  ;; # Ignore
            n)    login=$OPTARG ;;
            h)    host=$OPTARG ;;
            *)    echo "LPD started `basename $0` wrong." 1>&2
                  exit 2
                  ;;
        esac
    done

    [ "$login" ] || fail "No login name"
    [ "$host" ] || fail "No host name"

    ( /usr/local/libexec/make-ps-header $login $host "DVI File"
      /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args

Παρατηρήστε πως το φίλτρο πρέπει να αναλύσει την λίστα παραμέτρων για να προσδιορίσει το όνομα χρήστη και υπολογιστή. Η μέθοδος ανάλυσης είναι παρόμοια και για τα υπόλοιπα φίλτρα μετατροπής. Το φίλτρο κειμένου παίρνει ένα ελαφρώς διαφορετικό σετ παραμέτρων, (δείτε την ενότητα Πως δουλεύουν τα Φίλτρα).

Όπως αναφέραμε προηγούμενα, ο παραπάνω σχεδιασμός, αν και πραγματικά απλός, απενεργοποιεί την επιλογή «παρεμπόδισης σελίδων κεφαλίδας» (την επιλογή `-h`) του `lpr`. Αν οι χρήστες επιθυμούν να σώσουν ένα δέντρο (ή λίγα χρήματα, αν χρεώνετε τις σελίδες κεφαλίδας), δεν θα υπάρχει τρόπος για να γίνει αυτό, από τη στιγμή που κάθε εκτύπωση μέσω των φίλτρων θα συνοδεύεται και από μια σελίδα κεφαλίδας για κάθε εργασία.

Για να επιτρέψετε στους χρήστες να απενεργοποιούν τις σελίδες κεφαλίδας ανά εργασία, θα πρέπει να χρησιμοποιήσετε το τέχνασμα που παρουσιάσαμε στην ενότητα Καταμέτρηση με Σελίδες Κεφαλίδας: δηλαδή να γράψετε ένα φίλτρο εξόδου που να αναλύει την σελίδα κεφαλίδας που δημιουργείται από το LPD και να κατασκευάζει μια PostScript έκδοση. Αν ο χρήστης στείλει μια εργασία με `lpr `-h``, τότε ούτε το LPD, ούτε το φίλτρο εξόδου θα φτιάξουν σελίδα κεφαλίδας. Σε όλες τις άλλες περιπτώσεις, το φίλτρο εξόδου θα διαβάζει το κείμενο από το LPD και θα στέλνει τον κατάλληλο κώδικα PostScript στον εκτυπωτή ώστε να εκτυπώνεται η σελίδα κεφαλίδας.

Αν έχετε εκτυπωτή PostScript με σειριακή σύνδεση, μπορείτε να κάνετε χρήση της `lprps`, η οποία συνοδεύεται από ένα φίλτρο εξόδου, το `psof`, το οποία κάνει τα παραπάνω. Σημειώστε πως το `psof` δεν χρεώνει για τις σελίδες κεφαλίδας.

## 9.4.3 Εκτυπώσεις μέσω Δικτύου

Το FreeBSD υποστηρίζει τις εκτυπώσεις μέσω δικτύου: μπορεί να στείλει εργασίες σε απομακρυσμένους εκτυπωτές. Η έννοια της δικτυακής εκτύπωσης αναφέρεται γενικά σε δύο διαφορετικά πράγματα:

- Πρόσβαση σε εκτυπωτή συνδεδεμένο σε απομακρυσμένο υπολογιστή (host). Εγκαθιστάτε έναν εκτυπωτή με συμβατική σειριακή ή παράλληλη σύνδεση σε ένα υπολογιστή. Έπειτα, ρυθμίζετε το LPD για να ενεργοποιηθεί η πρόσβαση στον εκτυπωτή από άλλους υπολογιστές του δικτύου. Η ενότητα Εκτυπωτές Εγκατεστημένοι σε Απομακρυσμένους Υπολογιστές εξηγεί τις απαραίτητες ενέργειες.

- Πρόσβαση σε εκτυπωτή συνδεδεμένο κατευθείαν στο δίκτυο. Εκτός (ή αντί) της συμβατικής σειριακής ή παράλληλης θύρας, ο εκτυπωτής πρέπει να έχει επιπρόσθετα μια δικτυακή διασύνδεση. Ένας τέτοιος εκτυπωτής δουλεύει ως εξής:

  - Μπορεί να καταλαβαίνει το πρωτόκολλο LPD και να δημιουργεί ουρά αναμονής για τις εργασίες που προέρχονται από απομακρυσμένους υπολογιστές. Σε αυτή την περίπτωση, ενεργεί σαν ένας κανονικός υπολογιστής που εκτελεί το LPD. Ακολουθήστε την ίδια διαδικασία με την ενότητα Εκτυπωτές Εγκατεστημένοι σε Απομακρυσμένους Υπολογιστές για να εγκαταστήσετε αυτόν τον εκτυπωτή.

  - Μπορεί να υποστηρίζει σύνδεση δικτυακής ροής δεδομένων (data stream). Σε αυτή την περίπτωση, «συνδέετε» τον εκτυπωτή σε έναν υπολογιστή συνδεδεμένο στο δίκτυο, ο οποίος θα είναι υπεύθυνος για την παροχέτευση των εργασιών και την αποστολή τους στον εκτυπωτή. Η ενότητα Εκτυπωτές Με Συνδέσεις Δικτύου δίνει μερικές συμβουλές για την εγκατάσταση εκτυπωτών αυτού του τύπου.

### 9.4.3.1 Εκτυπωτές Εγκατεστημένοι σε Απομακρυσμένους Υπολογιστές

Το σύστημα παροχέτευσης LPD έχει ενσωματωμένη υποστήριξη για την αποστολή εργασιών σε άλλους υπολογιστές που εκτελούν το LPD (ή που είναι συμβατοί με το LPD). Αυτό το χαρακτηριστικό σας επιτρέπει να εγκαταστήσετε έναν εκτυπωτή σε ένα υπολογιστή και να έχετε πρόσβαση σε αυτόν από άλλους. Επίσης δουλεύει και με εκτυπωτές που έχουν δικτυακές διασυνδέσεις που καταλαβαίνουν το πρωτόκολλο LPD.

Για να ενεργοποιήσετε αυτόν τον τύπο απομακρυσμένης εκτύπωσης, εγκαταστήστε πρώτα έναν εκτυπωτή σε ένα υπολογιστή, τον υπολογιστή εκτύπωσης (printer host), χρησιμοποιώντας την απλή εγκατάσταση εκτυπωτή που περιγράφεται στην ενότητα Βασικές Ρυθμίσεις Εκτυπωτών. Κάντε όσες προχωρημένες ρυθμίσεις χρειάζεστε όπως αναφέρεται στις Ρυθμίσεις Εκτυπωτών για Προχωρημένους. Ελέγξτε τον εκτυπωτή και δείτε αν δουλεύει με τα χαρακτηριστικά του LPD που έχετε ενεργοποιήσει. Επίσης βεβαιωθείτε πως ο τοπικός υπολογιστής (local host) είναι εξουσιοδοτημένος να χρησιμοποιεί τις υπηρεσίες του LPD στον απομακρυσμένο υπολογιστή (remote host) (δείτε Παρεμπόδιση Εργασιών από Απομακρυσμένους Υπολογιστές).

Εάν χρησιμοποιείτε εκτυπωτή με δικτυακή διασύνδεση που είναι συμβατός με το LPD, τότε ο ο υπολογιστής εκτύπωσης (printer host) είναι ο εν λόγω εκτυπωτής, και το όνομα του εκτυπωτή είναι το όνομα που έχετε ορίσει για τον εκτυπωτή. Δείτε την τεκμηρίωση που συνοδεύει τον εκτυπωτή σας και/ή την κάρτα δικτύου του.

> Υπόδειξη: Αν χρησιμοποιείτε Hewlett Packard Laserjet με όνομα εκτυπωτή `text` θα γίνονται αυτόματα οι μετατροπές από LF σε CRLF, επομένως δεν χρειάζεται να τρέξετε το script `hpif`.

Επομένως, στους υπόλοιπους υπολογιστές όπου επιθυμείτε να έχετε πρόσβαση στον εκτυπωτή, απλά κάντε μια καταχώριση στο αρχείο `/etc/printcap` με τα ακόλουθα στοιχεία:

1. Ονομάστε την καταχώριση όπως επιθυμείτε: Για δική σας ευκολία πιθανώς να θέλετε να χρησιμοποιήσετε το ίδιο όνομα και τα ίδια παρωνύμια με αυτά του υπολογιστή εκτύπωσης.

2. Αφήστε την ικανότητα `lp` κενή, για την ακρίβεια (`:lp=:`).

3. Δημιουργήστε ένα κατάλογο spooling και προσδιορίστε την τοποθεσία του με την ικανότητα `sd`. Το LPD θα αποθηκεύει εδώ τις εργασίες πριν την αποστολή τους στον υπολογιστή εκτύπωσης.

4. Τοποθετήστε το όνομα του υπολογιστή εκτύπωσης στην ικανότητα `rm`.

5. Τοποθετήστε το όνομα του εκτυπωτή στην ικανότητα `rp`, στον υπολογιστή εκτύπωσης.

Αυτό είναι όλο. Δεν χρειάζεται να δημιουργήσετε λίστα φίλτρων μετατροπής, διαστάσεις σελίδας, ή οτιδήποτε άλλο στο αρχείο`/etc/printcap`.

Εδώ είναι ένα παράδειγμα. Ο υπολογιστής `rose` έχει δύο εκτυπωτές, τον `bamboo` και τον `rattan`. Θέλουμε να ενεργοποιήσουμε τις εκτυπώσεις σε αυτούς τους εκτυπωτές για τους χρήστες του απομακρυσμένου υπολογιστή `orchid`. Εδώ είναι το αρχείο `/etc/printcap` του υπολογιστή `orchid` (δείτε πιο πίσω στην ενότητα Ενεργοποίηση Σελίδων Κεφαλίδας). Ήδη έχει μια καταχώριση για τον εκτυπωτή `teak`. Εδώ προσθέσαμε τις απαραίτητες καταχωρίσεις για τους δύο εκτυπωτές του υπολογιστή `rose`:

    #
    #  /etc/printcap for host orchid - added (remote) printers on rose
    #

    #
    #  teak is local; it is connected directly to orchid:
    #
    teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
            :lp=/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 connected to rose; send jobs for rattan to rose:
    #
    rattan|line|diablo|lp|Diablo 630 Line Printer:\
            :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:

    #
    #  bamboo is connected to rose as well:
    #
    bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
            :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:

Το μόνο που απομένει είναι να δημιουργήσουμε τους καταλόγους spooling στον κόμβο `orchid`:

    # 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

Τώρα, οι χρήστες του `orchid` μπορούν να εκτυπώνουν στον `rattan` και στον `bamboo`. Αν, για παράδειγμα, ένας χρήστης του `orchid` πληκτρολογήσει:

    % lpr -P bamboo -d sushi-review.dvi

το σύστημα LPD στον `orchid` θα αντιγράψει την εργασία στον κατάλογο spooling `/var/spool/lpd/bamboo` και θα σημειώσει πως πρόκειται για εργασία DVI. Μόλις ο υπολογιστής `rose` έχει διαθέσιμο χώρο στον κατάλογο spooling του `bamboo`, τα δύο LPDs θα μεταφέρουν το αρχείο στον `rose`. Το αρχείο θα μπει σε ουρά αναμονής στον υπολογιστή `rose` έως ότου εκτυπωθεί. Θα μετατραπεί από DVI σε PostScript (αφού ο `bamboo` είναι εκτυπωτής PostScript) στον υπολογιστή `rose`.

### 9.4.3.2 Εκτυπωτές με Συνδέσεις Δικτύου

Συχνά, όταν αγοράζετε κάρτα δικτύου για εκτυπωτή, έχετε τη δυνατότητα επιλογής δύο εκδόσεων: η μία είναι προσομοίωση του spooler (η πιο ακριβή έκδοση) ενώ η άλλη απλά σας επιτρέπει να στέλνετε δεδομένα μέσω αυτής σαν να χρησιμοποιούσατε μια σειριακή ή παράλληλη θύρα (η φτηνή έκδοση). Αυτή η ενότητα περιγράφει πως να χρησιμοποιείτε την φτηνή έκδοση. Για την πιο ακριβή έκδοση μπορείτε να βρείτε περισσότερες πληροφορίες στην προηγούμενη ενότητα Εκτυπωτές Εγκατεστημένοι σε Απομακρυσμένους Υπολογιστές.

Η μορφή του αρχείου `/etc/printcap` σας επιτρέπει να ορίσετε τη διασύνδεση - σειριακή ή παράλληλη - που θα χρησιμοποιήσετε, και (αν χρησιμοποιείτε σειριακή διασύνδεση) τον ρυθμό baud, πιθανούς ελέγχους ροής, καθυστερήσεις για tabs, μετατροπές για χαρακτήρες νέας γραμμής, και άλλα. Αλλά δεν υπάρχει τρόπος να ορίσετε μια σύνδεση σε εκτυπωτή που ακούει σε θύρα TCP/IP ή άλλο τύπο δικτύου.

Για να στείλετε δεδομένα σε ένα δικτυακό εκτυπωτή, χρειάζεται να αναπτύξετε προγράμματα επικοινωνίας που να καλούνται από φίλτρα κειμένου και φίλτρα μετατροπής. Εδώ έχουμε ένα τέτοιο παράδειγμα: το script `netprint` παίρνει όλα τα δεδομένα από το standard input και τα στέλνει σε έναν εκτυπωτή συνδεδεμένο στο δίκτυο. Ορίζουμε στο `netprint` το όνομα του εκτυπωτή ως πρώτη παράμετρο, και τον αριθμό θύρας στην οποία συνδέεται ως δεύτερη. Σημειώστε πως αυτός ο τρόπος υποστηρίζει μόνο επικοινωνία μιας κατεύθυνσης (από το FreeBSD στον εκτυπωτή). Πολλοί δικτυακοί εκτυπωτές υποστηρίζουν αμφίδρομη επικοινωνία, και είναι πολύ πιθανό να επιθυμείτε να εκμεταλλευτείτε τα προτερήματα τους (για να ελέγχετε την κατάσταση του εκτυπωτή, για καταμέτρηση εκτυπώσεων, κλπ.).

    #!/usr/bin/perl
    #
    #  netprint - Text filter for printer attached to network
    #  Installed in /usr/local/libexec/netprint
    #
    $#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";

    $printer_host = $ARGV[0];
    $printer_port = $ARGV[1];

    require 'sys/socket.ph';

    ($ignore, $ignore, $protocol) = getprotobyname('tcp');
    ($ignore, $ignore, $ignore, $ignore, $address)
        = gethostbyname($printer_host);

    $sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);

    socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
        || die "Can't create TCP/IP stream socket: $!";
    connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
    while (<STDIN>) { print PRINTER; }
    exit 0;

Μπορείτε να χρησιμοποιήσετε αυτό το script σε διάφορα φίλτρα. Ας υποθέσουμε πως έχουμε έναν εκτυπωτή γραμμής Diablo 750-N συνδεδεμένο στο δίκτυο. Ο εκτυπωτής δέχεται δεδομένα προς εκτύπωση στην θύρα 5100. Το όνομα του εκτυπωτή στο δίκτυο είναι `scrivener`. Εδώ είναι το φίλτρο κειμένου για τον εκτυπωτή:

    #!/bin/sh
    #
    #  diablo-if-net - Text filter for Diablo printer `scrivener' listening
    #  on port 5100.   Installed in /usr/local/libexec/diablo-if-net
    #
    exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100

## 9.4.4 Έλεγχος Πρόσβασης και Περιορισμοί στη Χρήση των Εκτυπωτών

Αυτή η ενότητα δίνει πληροφορίες για τον έλεγχο πρόσβασης και τον περιορισμό χρήσης των εκτυπωτών. Το σύστημα LPD σας επιτρέπει να ελέγχετε ποιός μπορεί να έχει πρόσβαση σε κάθε εκτυπωτή, τόσο τοπικά όσο και απομακρυσμένα, και επίσης αν μπορούν οι χρήστες να εκτυπώνουν πολλαπλά αντίγραφα, πόσο μεγάλες μπορούν να είναι οι εργασίες τους, και πόσο μεγάλες μπορούν να γίνουν οι ουρές αναμονής (print queues).

### 9.4.4.1 Περιορισμός Εκτύπωσης Πολλαπλών Αντιγράφων

Το σύστημα LPD διευκολύνει τους χρήστες να εκτυπώσουν πολλαπλά αντίγραφα ενός αρχείου. Οι χρήστες μπορούν να εκτυπώνουν εργασίες με `lpr `-#5`` (για παράδειγμα) και να παίρνουν πέντε αντίγραφα κάθε αρχείου της εργασίας εκτύπωσης. Το αν αυτό είναι καλό, εξαρτάται από εσάς.

Αν πιστεύετε πως τα πολλαπλά αντίγραφα δημιουργούν άσκοπη καταπόνηση των εκτυπωτών σας, μπορείτε να απενεργοποιήσετε την επιλογή `-#` στο lpr(1) προσθέτοντας την ικανότητα `sc` στο αρχείο `/etc/printcap`. Όταν οι χρήστες αποστέλλουν εργασίες με την επιλογή `-#`, θα βλέπουν:

    lpr: multiple copies are not allowed

Σημειώστε πως αν έχετε ρυθμίσει πρόσβαση σε έναν εκτυπωτή απομακρυσμένα (δείτε την ενότητα Εκτυπωτές Εγκατεστημένοι σε Απομακρυσμένους Υπολογιστές), θα χρειαστεί να προσθέσετε την ικανότητα `sc` σε όλα τα απομακρυσμένα αρχεία `/etc/printcap`, διαφορετικά οι χρήστες θα έχουν ακόμη την δυνατότητα να αποστέλλουν εργασίες πολλαπλών αντιγράφων χρησιμοποιώντας διαφορετικό κόμβο.

Εδώ είναι ένα παράδειγμα. Αυτό είναι το αρχείο `/etc/printcap` για τον κόμβο `rose`. Ο εκτυπωτής `rattan` είναι δυνατό μηχάνημα και επιτρέπει την εκτύπωση πολλαπλών αντιγράφων, αλλά ο εκτυπωτής laser `bamboo` είναι πιο ευαίσθητο, επομένως θα απενεργοποιήσουμε τη δυνατότητα πολλαπλών αντιγράφων προσθέτοντας την ικανότητα `sc`:

    #
    #  /etc/printcap for host rose - restrict multiple copies on bamboo
    #
    rattan|line|diablo|lp|Diablo 630 Line Printer:\
            :sh:sd=/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/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
            :if=/usr/local/libexec/psif:\
            :df=/usr/local/libexec/psdf:

Τώρα, θα χρειαστεί να προσθέσουμε επίσης την ικανότητα `sc` στο αρχείο `/etc/printcap` του κόμβου `orchid` (και ενώ βρισκόμαστε σε αυτό, επιτρέψτε μας να απενεργοποιήσουμε τα πολλαπλά αντίγραφα για τον εκτυπωτή `teak`):

    #
    #  /etc/printcap for host orchid - no multiple copies for local
    #  printer teak or remote printer bamboo
    teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
            :lp=/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:

Χρησιμοποιώντας την ικανότητα `sc`, προλαμβάνουμε την χρήση των εντολών `lpr `-#``, αλλά δεν έχουμε ακόμη την δυνατότητα να παρεμποδίσουμε τους χρήστες να τρέξουν την εντολή lpr(1) πολλές φορές, ή να αποστείλουν το ίδιο αρχείο πολλές φορές σε μία μοναδική εργασία, όπως εδώ:

    % lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign

Υπάρχουν πολλοί τρόποι πρόληψης αυτών των ενεργειών (συμπεριλαμβάνοντας και την περίπτωση να το αγνοήσετε) που είστε ελεύθεροι να εξερευνήσετε.

### 9.4.4.2 Περιορίζοντας την Πρόσβαση σε Εκτυπωτές

Μπορείτε να ελέγχετε ποιός μπορεί να εκτυπώνει σε ποιόν εκτυπωτή χρησιμοποιώντας τους μηχανισμούς ομάδων (groups) του UNIX® και την ικανότητα `rg` στο `/etc/printcap`. Απλά τοποθετήστε τους χρήστες που θέλετε να έχουν πρόσβαση σε κάποιον εκτυπωτή σε μια συγκεκριμένη ομάδα (χρηστών), και δηλώστε αυτή την ομάδα στην ικανότητα `rg`.

Όλοι οι χρήστες που δεν ανήκουν στην ομάδα (συμπεριλαμβανομένου και του `root`) θα δέχονται το ακόλουθο μήνυμα: “`lpr: Not a member of the restricted group`” όταν προσπαθούν να εκτυπώσουν στον ελεγχόμενο εκτυπωτή.

Όπως και με την ικανότητα `sc` (περιορισμού πολλαπλών αντιγράφων), θα χρειαστεί να προσδιορίσετε την `rg` στους απομακρυσμένους κόμβους που θα έχουν πρόσβαση στους εκτυπωτές σας, αν νομίζετε πως αυτό είναι σωστό (δείτε την ενότητα Εκτυπωτές Εγκατεστημένοι σε Απομακρυσμένους Υπολογιστές).

Για παράδειγμα, θα αφήσουμε για όλους ελεύθερη την πρόσβαση στον εκτυπωτή `rattan`, αλλά μόνο οι χρήστες της ομάδας `artists` θα μπορούν να χρησιμοποιήσουν τον `bamboo`. Εδώ είναι το γνωστό μας `/etc/printcap` για τον κόμβο `rose`:

    #
    #  /etc/printcap for host rose - restricted group for bamboo
    #
    rattan|line|diablo|lp|Diablo 630 Line Printer:\
            :sh:sd=/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/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
            :if=/usr/local/libexec/psif:\
            :df=/usr/local/libexec/psdf:

Επιτρέψτε μας να μην αλλάξουμε το αρχείο `/etc/printcap` από το άλλο παράδειγμα (για τον υπολογιστή `orchid`). Φυσικά, οποιοσδήποτε χρήστης του `orchid` μπορεί να εκτυπώσει στον `bamboo`. Ίσως όμως να επιτρέπουμε μόνον σε συγκεκριμένους χρήστες την πρόσβαση στον υπολογιστή `orchid`, και θέλουμε αυτοί οι χρήστες να έχουν πρόσβαση στον εκτυπωτή. Ή ίσως πάλι, και όχι.

> Σημείωση: Επιτρέπεται μόνο μια περιορισμένη ομάδα ανά εκτυπωτή.

### 9.4.4.3 Έλεγχος Μεγέθους των Απεσταλμένων Εργασιών

Αν πολλοί χρήστες έχουν πρόσβαση στους εκτυπωτές σας, πιθανώς να χρειάζεται να θέσετε ένα ανώτατο όριο στο επιτρεπόμενο μέγεθος αρχείων που μπορούν να αποστείλουν οι χρήστες για εκτύπωση. Ακόμα και αν υπάρχει αρκετός χώρος στο σύστημα αρχείων που φιλοξενεί τους καταλόγους spool, θα πρέπει ωστόσο να βεβαιωθείτε ότι επαρκεί για τις εργασίες όλων των χρηστών.

Το LPD σας επιτρέπει να οριοθετήσετε το μέγιστο αριθμό bytes που περιέχει μια εργασία, με την ικανότητα `mx`. Η μονάδα μέτρησης είναι σε `BUFSIZ` blocks, τα οποία είναι 1024 bytes. Αν θέσετε μηδέν σε αυτή την ικανότητα, δεν θα υπάρχουν όρια στο μέγεθος των αρχείων. Ωστόσο, αν δεν έχει οριστεί η ικανότητα `mx`, τότε θα χρησιμοποιείται η προεπιλεγμένη τιμή των 1000 blocks.

> Σημείωση: Το όριο εφαρμόζεται στα αρχεία μιας εργασίας, και όχι στο συνολικό μέγεθος της εργασίας.

Το LPD δεν θα απορρίψει ένα αρχείο που ξεπερνά το όριο μεγέθους που έχετε θέσει. Αντιθέτως, θα το τοποθετήσει στην ουρά αναμονής με μέγεθος ίσο με το μέγιστο επιτρεπτό, το οποίο και θα εκτυπώσει τελικά. Το υπόλοιπο αρχείο απορρίπτεται. Αν αυτός είναι σωστός ή λανθασμένος τρόπος αντιμετώπισης για την υπέρβαση του ορίου, είναι θέμα προς συζήτηση.

Ας οριοθετήσουμε στο παράδειγμα μας τους εκτυπωτές `rattan` και `bamboo`. Επειδή τα αρχεία PostScript των `artists` τείνουν προς μεγάλα μεγέθη, θα θέσουμε ένα όριο πέντε megabytes. Δεν θα θέσουμε όρια για τον εκτυπωτή γραμμής απλού κειμένου:

    #
    #  /etc/printcap for host rose
    #

    #
    #  No limit on job size:
    #
    rattan|line|diablo|lp|Diablo 630 Line Printer:\
            :sh:mx#0:sd=/var/spool/lpd/rattan:\
            :lp=/dev/lpt0:\
            :if=/usr/local/libexec/if-simple:

    #
    #  Limit of five megabytes:
    #
    bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
            :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
            :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
            :if=/usr/local/libexec/psif:\
            :df=/usr/local/libexec/psdf:

Και πάλι, τα όρια εφαρμόζονται μόνο για τους τοπικούς χρήστες. Αν έχετε ενεργοποιήσει απομακρυσμένη πρόσβαση για τους εκτυπωτές σας, τα όρια αυτά δεν ισχύουν για τους απομακρυσμένους χρήστες. Θα χρειαστεί να προσδιορίσετε με την ικανότητα `mx` και τα απομακρυσμένα αρχεία `/etc/printcap`. Δείτε την ενότητα Εκτυπωτές Εγκατεστημένοι σε Απομακρυσμένους Υπολογιστές για περισσότερες πληροφορίες σχετικά με τις εκτυπώσεις από απομακρυσμένους υπολογιστές.

Υπάρχει και άλλος εξειδικευμένος τρόπος περιορισμού του μεγέθους εργασιών για απομακρυσμένους εκτυπωτές. Δείτε την ενότητα Περιορισμός Εργασιών από Απομακρυσμένους Υπολογιστές.

### 9.4.4.4 Περιορισμός Εργασιών από Απομακρυσμένους Υπολογιστές

Το σύστημα παροχέτευσης LPD παρέχει διάφορους τρόπους περιορισμού των εργασιών από απομακρυσμένους υπολογιστές:

Παρεμπόδιση υπολογιστών

  Μπορείτε να ελέγχετε από ποιους απομακρυσμένους υπολογιστές θα δέχεται αιτήσεις εκτύπωσης το τοπικό LPD, χρησιμοποιώντας τα αρχεία `/etc/hosts.equiv` και `/etc/hosts.lpd`. Το LPD ελέγχει να δει αν η εισερχόμενη αίτηση προέρχεται από έναν υπολογιστή που αναφέρεται σε κάποιο από τα δύο αρχεία. Αν όχι, το LPD απορρίπτει την αίτηση.

  Η μορφή αυτών των αρχείων είναι απλή: ένα όνομα υπολογιστή ανά γραμμή. Παρατηρήστε πως το αρχείο `/etc/hosts.equiv` χρησιμοποιείται και από το πρωτόκολλο ruserok(3), και επηρεάζει προγράμματα όπως το rsh(1) και το rcp(1), επομένως να είστε προσεκτικοί.

  Για παράδειγμα, εδώ είναι το αρχείο `/etc/hosts.lpd` στον υπολογιστή `rose`:

      orchid
      violet
      madrigal.fishbaum.de

  Αυτό σημαίνει πως ο `rose` δέχεται αιτήσεις από τους υπολογιστές `orchid`, `violet`, και `madrigal.fishbaum.de`. Αν κάποιος άλλος υπολογιστής προσπαθήσει να αποκτήσει πρόσβαση στο LPD του `rose`, η εργασία θα απορριφθεί.

Περιορισμοί στο Μέγεθος

  Μπορείτε να ελέγχετε πόσος ελεύθερος χώρος πρέπει να απομένει στο σύστημα αρχείων όπου βρίσκεται ο κατάλογος spool. Δημιουργήστε ένα αρχείο με όνομα `minfree` στον κατάλογο spool για τον τοπικό εκτυπωτή. Εισάγετε σε αυτό το αρχείο έναν αριθμό που αντιπροσωπεύει πόσα blocks δίσκου (512 bytes) ελεύθερου χώρου πρέπει να υπάρχουν για να είναι δεκτή μια απομακρυσμένη εργασία.

  Αυτό σας επιτρέπει να είστε βέβαιοι πως οι απομακρυσμένοι χρήστες δεν θα γεμίσουν το σύστημα αρχείων σας. Μπορείτε επίσης να το χρησιμοποιήσετε για να δώσετε μερική προτεραιότητα στους τοπικούς χρήστες: οι τοπικοί χρήστες θα μπορούν να στέλνουν εργασίες στην ουρά αναμονής ακόμη και όταν ο ελεύθερος χώρος του δίσκου έχει πέσει κάτω από τον αριθμό που αναφέρεται στο αρχείο `minfree`.

  Για παράδειγμα, ας προσθέσουμε ένα αρχείο `minfree` για τον εκτυπωτή `bamboo`. Εξετάζουμε το `/etc/printcap` για να βρούμε τον κατάλογο spool για αυτόν τον εκτυπωτή. Εδώ είναι η καταχώριση για τον `bamboo`:

      bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
              :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
              :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:mx#5000:\
              :if=/usr/local/libexec/psif:\
              :df=/usr/local/libexec/psdf:

  Ο κατάλογος spool καθορίζεται στην ικανότητα `sd`. Θα θέσουμε τρία megabytes (ισοδυναμεί με 6144 disk blocks) ως το μέγεθος του ελεύθερου χώρου που πρέπει να υπάρχει στο σύστημα αρχείων, ώστε το LPD να δέχεται απομακρυσμένες εργασίες:

      # echo 6144 > /var/spool/lpd/bamboo/minfree

Περιορισμοί χρηστών

  Μπορείτε να ελέγχετε ποιός απομακρυσμένος χρήστης μπορεί να εκτυπώνει στους τοπικούς εκτυπωτές ορίζοντας την ικανότητα `rs` στο `/etc/printcap`. Όταν εμφανίζεται η `rs` σε μια καταχώριση κάποιου τοπικά συνδεδεμένου εκτυπωτή, το LPD θα δεχθεί εργασίες από απομακρυσμένους υπολογιστές αν ο χρήστης που αποστέλλει την εργασία έχει λογαριασμό στον τοπικό υπολογιστή και με το ίδιο όνομα χρήστη. Διαφορετικά, το LPD θα απορρίψει την εργασία.

  Αυτή η ικανότητα είναι ιδιαίτερα χρήσιμη σε περιβάλλοντα όπου υπάρχουν (για παράδειγμα) διαφορετικά επιχειρησιακά τμήματα που μοιράζονται το δίκτυο, και κάποιοι χρήστες πρέπει να υπερβαίνουν τα σύνορα του τμήματος. Δημιουργώντας λογαριασμούς στα συστήματα σας, θα μπορούν να χρησιμοποιούν τους εκτυπωτές σας από το δικό τους τμήμα της επιχείρησης. Αν επιθυμείτε να τους επιτρέπετε να χρησιμοποιούν μόνο τους εκτυπωτές και όχι τα μηχανήματα σας, τότε μπορείτε να δημιουργήσετε λογαριασμούς «token», δίχως προσωπικούς καταλόγους και με κέλυφος που δεν μπορεί να χρησιμοποιηθεί, όπως το `/usr/bin/false`.

## 9.4.5 Καταμέτρηση Χρήσης Εκτυπωτών

Αποφασίσατε ότι χρειάζεται να χρεώνετε για τις εκτυπώσεις σας. Και γιατί όχι; Το χαρτί και το μελάνι κοστίζουν χρήματα. Και επιπλέον υπάρχει κόστος συντήρησης -- οι εκτυπωτές αποτελούνται από κινητά μέρη και έχουν την τάση να χαλάνε. Έχετε εξετάσει τους εκτυπωτές σας, τον τρόπο που χρησιμοποιούνται, και το κόστος συντήρησης και έχετε υπολογίσει μια χρέωση ανά σελίδα (ή ανά μέτρο, ανά πόδι, ή άλλη μονάδα μέτρησης). Το θέμα είναι τώρα πως μπορείτε πραγματικά να ξεκινήσετε να καταμετράτε τις εκτυπώσεις σας.

Τα άσχημα νέα είναι πως το σύστημα παροχέτευσης του LPD δεν παρέχει πολύ βοήθεια σε αυτόν τον τομέα. Η καταμέτρηση εξαρτάται σε μεγάλο βαθμό από τον τύπο του εκτυπωτή που χρησιμοποιείτε, τους τύπους αρχείων που εκτυπώνετε, και τις δικές σας απαιτήσεις για την χρέωση των εκτυπώσεων.

Για την καταμέτρηση, θα πρέπει να μετατρέψετε το φίλτρο κειμένου (για τη χρέωση εργασιών απλού κειμένου) του εκτυπωτή και τα φίλτρα μετατροπής (για τη χρέωση όλων των άλλων τύπων αρχείων) ώστε να μετρούν σελίδες ή να ζητούν να μάθουν από τον εκτυπωτή τον αριθμό των εκτυπωμένων σελίδων. Δεν θα σας βοηθήσει ιδιαίτερα η χρήση φίλτρου εξόδου, από τη στιγμή που δεν μπορεί να κάνει καταμέτρηση. Δείτε την ενότητα Φίλτρα.

Γενικά, υπάρχουν δύο τρόποι για να κάνετε καταμέτρηση:

- Η Περιοδική καταμέτρηση είναι ο πιο συνηθισμένος τρόπος, πιθανώς γιατί είναι ο ευκολότερος. Κάθε φορά που κάποιος εκτυπώνει μια εργασία, το φίλτρο δημιουργεί ένα αρχείο καταγραφής όπου αναφέρει τον χρήστη, τον υπολογιστή, και τον αριθμό των σελίδων. Κάθε μήνα, εξάμηνο, χρόνο, ή άλλη χρονική περίοδο της αρεσκείας σας, συλλέγετε τα αρχεία καταγραφής για τους διάφορους εκτυπωτές, λογαριάζετε τις σελίδες που αναλογούν στους χρήστες, και χρεώνετε αναλόγως. Έπειτα σβήνετε τα στοιχεία από τα αρχεία καταγραφής, ξεκινώντας από καθαρή κατάσταση για την επόμενη περίοδο.

- Η Καταμέτρηση κατά τη χρήση είναι λιγότερο γνωστή, ίσως επειδή είναι πιο δύσκολος τρόπος. Σε αυτή τη μέθοδο τα φίλτρα χρεώνουν τους χρήστες για τις εκτυπώσεις τους αμέσως μόλις αυτές πραγματοποιηθούν. Όπως και με την καταγραφή χρήσης δίσκου (disk quotas), η καταμέτρηση είναι άμεση. Μπορείτε να προλαμβάνετε την χρήση εκτυπωτών από χρήστες που έχουν χτυπήσει κόκκινο, και μπορείτε να παρέχετε στους χρήστες ένα τρόπο για να ελέγχουν και να ρυθμίζουν τον «όγκο εκτυπώσεων (print quotas).» Αλλά αυτή η μέθοδος προϋποθέτει λίγο κώδικα βάσεων δεδομένων για την καταγραφή χρηστών και των εν λόγω μεγεθών.

Το σύστημα παροχέτευσης LPD υποστηρίζει εύκολα και τις δύο μεθόδους: από τη στιγμή που πρέπει εσείς να παρέχετε τα φίλτρα (τις περισσότερες φορές), θα πρέπει επίσης να παρέχετε και τον κώδικα καταμέτρησης. Αλλά υπάρχει και ένα καλό σε αυτή την υπόθεση: έχετε απεριόριστη ευελιξία στις μεθόδους καταμέτρησης. Για παράδειγμα, μπορείτε να επιλέξετε περιοδική ή κατά τη χρήση καταμέτρηση. Μπορείτε να επιλέξετε τις πληροφορίες που θα καταγράφονται: ονόματα χρηστών, ονόματα υπολογιστών, τύπους εργασιών, τυπωμένες σελίδες, τετραγωνικά μέτρα χαρτιού που χρησιμοποιήθηκε, πόσος χρόνος χρειάστηκε για να γίνει η εκτύπωση, και πολλά ακόμα. Και όλα αυτά γίνονται μετατρέποντας τα φίλτρα για να αποθηκεύουν αυτές τις πληροφορίες.

### 9.4.5.1 Γρήγορη και Πρόχειρη Καταμέτρηση Εκτυπώσεων

Το FreeBSD διατίθεται με δύο προγράμματα που μπορούν να παρέχουν άμεσα απλή περιοδική καταμέτρηση. Είναι το φίλτρο κειμένου `lpf`, που περιγράφεται στην ενότητα lpf: ένα Φίλτρο Κειμένου, και το pac(8), ένα πρόγραμμα που συλλέγει και αθροίζει καταχωρίσεις από αρχεία καταμετρήσεων.

Όπως αναφέραμε στην ενότητα των φίλτρων (Φίλτρα), το LPD ξεκινά τα φίλτρα κειμένου και μετατροπής περνώντας στην γραμμή εντολών του φίλτρου και το όνομα του αρχείου καταγραφής. Τα φίλτρα μπορούν να χρησιμοποιήσουν αυτή την παράμετρο για να ξέρουν που να γράφουν τις καταχωρίσεις καταμέτρησης. Το όνομα του αρχείου καταμέτρησης φαίνεται στην ικανότητα `af` στο `/etc/printcap`, και αν δεν ορίζεται η πλήρης διαδρομή του, χρησιμοποιείται η σχετική διαδρομή ως προς τον κατάλογο spool.

Το LPD ξεκινά το `lpf` με παραμέτρους πλάτους και μήκους σελίδας (από τις ικανότητες `pw` και `pl`). Το `lpf` χρησιμοποιεί αυτές τις παραμέτρους για να προσδιορίσει την ποσότητα χαρτιού που χρησιμοποιήθηκε. Μετά την αποστολή του αρχείου στον εκτυπωτή, γράφει μια καταχώριση καταμέτρησης στο αρχείο καταγραφής. Οι καταχωρίσεις μοιάζουν με τις παρακάτω:

    2.00 rose:andy
    3.00 rose:kelly
    3.00 orchid:mary
    5.00 orchid:mary
    2.00 orchid:zhang

Θα πρέπει να χρησιμοποιείτε ξεχωριστό αρχείο καταγραφής για κάθε εκτυπωτή, αφού το `lpf` δεν έχει ενσωματωμένη δυνατότητα κλειδώματος αρχείου (file locking), και δύο `lpf` μπορούν να καταστρέψουν το ένα την καταχώριση του άλλου αν πρόκειται να γράψουν ταυτόχρονα στο ίδιο αρχείο. Ένας εύκολος τρόπος για να βεβαιώσετε την μοναδικότητα αρχείου καταγραφής ανά εκτυπωτή είναι να χρησιμοποιήσετε την ικανότητα `af=acct` στο `/etc/printcap`. Έτσι, κάθε αρχείο καταγραφής θα βρίσκεται στον κατάλογο spool του αντίστοιχου εκτυπωτή, σε ένα αρχείο με όνομα `acct`.

Όταν είστε έτοιμοι να χρεώσετε τους χρήστες για τις εκτυπώσεις, εκτελέστε το πρόγραμμα pac(8). Απλά μεταβείτε στον κατάλογο spool για τον εκτυπωτή που κάνετε καταμέτρηση και πληκτρολογήστε `pac`. Θα εμφανιστεί ένας απολογισμός με χρεώσεις σε δολάρια, όπως βλέπετε στη συνέχεια:

      Login               pages/feet   runs    price
    orchid:kelly                5.00    1   $  0.10
    orchid:mary                31.00    3   $  0.62
    orchid:zhang                9.00    1   $  0.18
    rose:andy                   2.00    1   $  0.04
    rose:kelly                177.00  104   $  3.54
    rose:mary                  87.00   32   $  1.74
    rose:root                  26.00   12   $  0.52

    total                     337.00  154   $  6.74

Παρακάτω είναι οι παράμετροι που δέχεται το pac(8):

`-P`printer``

  Για ποιό `printer` να κάνει απολογισμό. Αυτή η επιλογή δουλεύει μόνο αν υπάρχει η πλήρης διαδρομή στην ικανότητα `af` στο `/etc/printcap`.

`-c`

  Ταξινομεί το αποτέλεσμα ανά κόστος αντί της αλφαβητικής ταξινόμησης των χρηστών.

`-m`

  Αγνοεί το όνομα του υπολογιστή στα αρχεία καταγραφής. Με αυτή την επιλογή, ο χρήστης `smith` στον υπολογιστή `alpha` είναι ο ίδιος χρήστης με τον `smith` στον υπολογιστή `gamma`. Χωρίς την επιλογή αυτή, είναι διαφορετικοί χρήστες.

`-p`price``

  Υπολογίζει τις χρεώσεις με `price` (τιμή) σε δολάρια ανά σελίδα ή ανά πόδι αντί για την τιμή από την ικανότητα `pc` στο `/etc/printcap`, ή αλλιώς δύο σεντς (από προεπιλογή). Μπορείτε να ορίσετε ως `price` μια τιμή με δεκαδικά ψηφία (floating point).

`-r`

  Αντιστρέφει την σειρά ταξινόμησης.

`-s`

  Δημιουργεί ένα αρχείο απολογισμού των καταμετρήσεων και καθαρίζει τα περιεχόμενα των αρχείων καταγραφής.

`name` `...`

  Τυπώνει πληροφορίες αναφοράς μόνο για τα συγκεκριμένα `name` (ονόματα) χρηστών.

Στον προεπιλεγμένο απολογισμό που παράγει το pac(8), βλέπετε των αριθμό των τυπωμένων σελίδων ανά χρήστη από τους διάφορους υπολογιστές. Αν, στο χώρο σας, ο υπολογιστής δεν έχει σημασία (γιατί οι χρήστες μπορούν να χρησιμοποιήσουν οποιονδήποτε θέλουν), εκτελέστε την εντολή `pac `-m``, για να δημιουργήσετε τον ακόλουθο απολογισμό:

      Login               pages/feet   runs    price
    andy                        2.00    1   $  0.04
    kelly                     182.00  105   $  3.64
    mary                      118.00   35   $  2.36
    root                       26.00   12   $  0.52
    zhang                       9.00    1   $  0.18

    total                     337.00  154   $  6.74

Για τον ορισμό ποσοστού χρέωσης σε δολάρια, το pac(8) χρησιμοποιεί την ικανότητα `pc` στο αρχείο `/etc/printcap` (προεπιλεγμένη τιμή 200, ή 2 σεντς ανά σελίδα). Προσδιορίστε σε αυτήν την ικανότητα, σε εκατοστά του σεντ, την τιμή ανά σελίδα ή ανά πόδι που θέλετε να χρεώνετε για τις εκτυπώσεις. Μπορείτε να προσπεράσετε αυτή την τιμή όταν τρέχετε το pac(8) με την επιλογή `-p`. H μονάδα μέτρησης για την επιλογή `-p` είναι σε δολάρια, όχι σε εκατοστά του σεντ. Για παράδειγμα,

    # pac -p1.50

ορίζει κόστος κάθε σελίδας ένα δολάριο και πενήντα σεντς. Μπορείτε πραγματικά να έχετε πολλά έσοδα χρησιμοποιώντας αυτές τις χρεώσεις.

Τέλος, εκτελώντας `pac `-s`` θα αποθηκεύσετε τις πληροφορίες του απολογισμού σε ένα αρχείο καταγραφής απολογισμού, που θα έχει το ίδιο όνομα με το αρχείο καταγραφής του εκτυπωτή, αλλά με κατάληξη `_sum`. Έπειτα καθαρίζεται το αρχείο καταγραφής. Όταν εκτελέσετε πάλι το pac(8), θα ξαναδιαβάσει το αρχείο απολογισμού, για να πάρει τα αρχικά σύνολα, και θα προσθέσει τις πληροφορίες από το κανονικό αρχείο καταγραφής.

### 9.4.5.2 Πως Μπορείτε να Μετρήσετε τις Τυπωμένες Σελίδες;

Για να μετρήσετε τις τυπωμένες σελίδες με έστω στοιχειώδη λεπτομέρεια, θα πρέπει να προσδιορίσετε πόσο χαρτί χρειάζεται μια εργασία. Αυτό είναι το ουσιαστικότερο πρόβλημα στην καταμέτρηση εκτυπώσεων.

Για εργασίες απλού κειμένου, το πρόβλημα δεν είναι δύσκολο να λυθεί: Μετράτε πόσες γραμμές υπάρχουν σε μια εργασία και τις συγκρίνετε με πόσες γραμμές μπορεί να τυπώσει ο εκτυπωτής σας σε μια σελίδα. Μην ξεχάσετε να συμπεριλάβετε τα backspaces που προκαλούν υπερτύπωση, ή επιμήκης λογικές γραμμές που αναδιπλώνονται σε περισσότερες από μία φυσικές γραμμές.

Το φίλτρο κειμένου `lpf` (που παρουσιάσαμε στο lpf: ένα Φίλτρο Κειμένου) λαμβάνει υπόψιν του αυτά τα στοιχεία όταν κάνει καταμέτρηση. Αν γράφετε κάποιο φίλτρο κειμένου που χρειάζεται να κάνει καταμέτρηση, ίσως να θέλετε να ελέγξετε τον πηγαίο κώδικα του `lpf`.

Πως χειρίζεστε όμως τους υπόλοιπους τύπους αρχείων;

Για τις μετατροπές από DVI-σε-LaserJet ή από DVI-σε-PostScript, μπορείτε να κάνετε το φίλτρο σας να αναλύει την έξοδο του `dvilj` ή του `dvips` και να ελέγχει πόσες σελίδες δημιουργήθηκαν από τη μετατροπή. Ίσως μπορέσετε να κάνετε κάτι παρόμοιο και με διαφορετικούς τύπους αρχείων και προγράμματα μετατροπής

Ωστόσο, όλες αυτές οι μέθοδοι έχουν το μειονέκτημα πως ο εκτυπωτής πιθανώς στην πραγματικότητα να μην εκτυπώσει όλες τις σελίδες. Για παράδειγμα, θα μπορούσε να μπλοκαριστεί το χαρτί, ή να τελειώσει το τόνερ, ή ακόμη να συμβεί και έκρηξη --ενώ ο χρήστης θα συνεχίσει να χρεώνεται.

Τι θα μπορούσατε να κάνετε;

Υπάρχει μόνο ένας σίγουρος τρόπος για να κάνετε καταμέτρηση ακριβείας. Να πάρετε έναν εκτυπωτή που να μπορεί να σας πει πόσο χαρτί χρησιμοποιεί, και να τον συνδέσετε μέσω σειριακής θύρας ή μέσω δικτύου. Σχεδόν όλοι οι εκτυπωτές PostScript υποστηρίζουν αυτή την δυνατότητα. Θα βρείτε και άλλους τύπους και κατασκευαστές που κάνουν επίσης το ίδιο (για παράδειγμα, οι laser εκτυπωτές δικτύου της Imagen). Μετατρέψτε τα φίλτρα για αυτούς τους εκτυπωτές ώστε να καταγράφουν τις τυπωμένες σελίδες μετά την ολοκλήρωση της εκάστοτε εργασίας εκτύπωσης, και ρυθμίστε τους να κρατούν αρχεία καταγραφής με μόνο αυτή την πληροφορία. Δεν χρειάζεται καταμέτρηση γραμμών ούτε αναφορά σφαλμάτων.

Φυσικά, πάντα έχετε τη δυνατότητα να φανείτε γενναιόδωρος και να παρέχετε τις εκτυπώσεις σας δωρεάν.

Προηγ | Αρχή | Επόμενο
Βασική Εγκατάσταση | Πάνω | Χρήση Εκτυπωτών

Αυτό το κείμενο, και άλλα κείμενα, μπορεί να βρεθεί στο ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Για ερωτήσεις σχετικά με το FreeBSD, διαβάστε την τεκμηρίωση πριν να επικοινωνήσετε με την <questions@FreeBSD.org>.
Για ερωτήσεις σχετικά με αυτή την τεκμηρίωση, στείλτε e-mail στην <doc@FreeBSD.org>.