Następna strona Poprzednia strona Spis treści

4. Rozwiązywanie problemów.

4.1 Ogólna strategia.

Jeśli masz jakieś problemy podczas drukowania, nawet jeśli działało kiedy wszystko ustawiałeś tak jak opisałem, to spójrz do /usr/adm/mesaages (albo do /usr/log/messages albo /var/log/messages - przyp. tłum.) oraz do /usr/adm/syslog (patrz poprzednia uwaga). Jeśli tylko spróbujesz coś wydrukowaæ używając filtru psf, to znajdziesz podobne linie w wymienionych wyżej plikach:

Feb 12 17:47:52 Pingo ofpap[1443]: starting for ?
Feb 12 17:47:52 Pingo ofpap[1443]: sending to pap[1444]
Feb 12 17:47:52 Pingo ofpap[1443]: straight text
Feb 12 17:47:59 Pingo ofpap[1443]: 1444 done
Feb 12 17:47:59 Pingo ofpap[1443]: pausing
Feb 12 17:48:01 Pingo ifpap[1447]: starting for ?
Feb 12 17:48:01 Pingo ifpap[1447]: sending to pap[1448]
Feb 12 17:48:01 Pingo ifpap[1447]: straight text
Feb 12 17:48:09 Pingo ifpap[1447]: 1448 done
Feb 12 17:48:09 Pingo ofpap[1443]: restarting
Feb 12 17:48:09 Pingo ifpap[1447]: done
Feb 12 17:48:09 Pingo ofpap[1443]: done
Feb 12 18:00:46 Pingo ofpap[1481]: starting for ?
Feb 12 18:00:46 Pingo ofpap[1481]: sending to pap[1482]
Feb 12 18:00:46 Pingo ofpap[1481]: straight text
Feb 12 18:00:51 Pingo ofpap[1481]: 1482 done
Feb 12 18:00:51 Pingo ofpap[1481]: pausing
Feb 12 18:00:52 Pingo ifpap[1485]: starting for ?
Feb 12 18:00:52 Pingo ifpap[1485]: sending to pap[1486]
Feb 12 18:00:52 Pingo ifpap[1485]: straight text
Feb 12 18:00:57 Pingo ifpap[1485]: 1486 done
Feb 12 18:00:57 Pingo ofpap[1481]: restarting
Feb 12 18:00:57 Pingo ofpap[1481]: done
Feb 12 18:00:57 Pingo ifpap[1485]: done

Jeśli coś nie działa, otrzymasz komunikat w /usr/adm/syslog jak ten:

Feb 12 10:04:59 Pingo papd[70]: No such printer: "lp"
Feb 12 10:04:59 Pingo papd[70]: printcap problem: "lp"

(twoja domyślna zmienna lp nie jest zdefiniowana)

Feb 12 17:02:21 Pingo ofpap[1149]: 1150 died with 1
Feb 12 17:02:21 Pingo lpd[1148]: lp: output filter died (1)
Feb 12 17:02:26 Pingo lpd[1148]: lp: Daemon filter 'f' terminated (11)
Feb 12 17:04:48 Pingo lpd[1195]: lp: Daemon filter 'f' terminated (11)
Feb 12 17:08:03 Pingo lpd[1216]: lp: Daemon filter 'f' terminated (11)
Feb 12 17:10:00 Pingo lpd[1228]: cannot execv /usr/local/bin/linebreak|/usr/local/atalk/ifpap
Feb 12 17:11:51 Pingo lpd[1244]: /usr/adm/lpd-errs: No such file or directory

(/etc/printcap nie akceptuje strumieni w definicji if; oto dlaczego używałem skryptu /usr/local/bin/myif. Zapomniałem także stworzyæ pliku /usr/adm/lpd-errs, który zdefiniowałem w /etc/printcap)

4.2 Nieznane problemy

Najpierw przeczytaj sekcjê o Znanych problemach. Jeśli nie bêdzie tam nic pomocnego dla ciebie, to wyślij do mnie list i dołącz do niego pliki /etc/printcap oraz /usr/local/atalk/etc/papd.conf.

nbplkup pokazuje nazwê drukarki i jej adres, ale ja nie dostajê żadnej odpowiedzi z programu papstatus od tej drukarki.

4.3 Znane problemy.

Dostajê dużo listów od ludzi, którzy mają problemy, wiêc umieszczê tutaj rozwiązania dla wszystkich. Bêdzie to rosnąca, nieposortowana lista. Po prostu sprawdź czy twój problem jest tu opisany.

nie ma wydruku zwykłego pliku tekstowego

Sprawdź czy nie masz w pliku /usr/adm/lpd-errs czegoś takiego:

unprintable character (0x9a)!

Jest to problem dotyczący psf, filtru użytego do drukowania. Zlokalizuj plik psf.c w swojej dystrybucji netatalk i uczyñ go zapisywalnym

chmod 644 psf.c

Zlokalizuj drugą liniê, w której jest łañcuch unprintable character. Pierwsze wystapienie (z dwóch) powino byæ w linii 402 a drugie - w 496 lub podobnie. Druga linia to jest przypuszczalnie ta, która ci sprawia kłopoty. Zamieñ

  if ( !isascii( *p ) || !isprint( *p )) {
      if ( !literal ) {
          fprintf( stderr, "unprintable character (0x%x)!\n",
                  (unsigned char)*p );
          return( 2 );  /* Toss job */
      }
      printf( "\\%o", (unsigned)*p );

na

  if ( !isascii( *p ) || !isprint( *p )) {
      if ( !literal ) {
          fprintf( stderr,
                  "unprintable character (0x%x) converted to ?!\n",
                  (unsigned char)*p );
          /* return( 2 );*/     /* Toss job */
          putchar( '?' );       /* Don't toss job!      */
      }
      else{
        printf( "\\%o", (unsigned)*p );
      }

Teraz napisz "make" w wierszu poleceñ w katalogu netatalk (nie w tym, w którym jest psf.c, bo make nie bêdzie w tym przypadku znało ścieżki do pap !). Potem skopiuj nowe psf do odpowiedniego katalogu (/usr/local/atalk/etc).

To co siê dzieje to: program zamienia niedrukowalny znak na znak "?" i nie przerywa pracy. Może ktoś ma lepszy pomysł na to jak przekonwertowaæ niedrukowalny znak na jego odpowiednik w PostScripcie ?

Ale jeśli to bêdziesz robił, to uważaj na prawa autorskie w psf !

nie ma umlautów, ani znaków narodowych

Jak właśnie wyżej wspomniałem, psf nie obsługuje rozszerzonych zbiorów znaków. Ale nenscript to potrafi. Ale ponieważ nie jest to filtr, który mógłby zostaæ użyty bezpośrednio w printcap-ie, bêdziesz musiał to obejśæ. Ja mam zdefiniowaną dodatkową drukarkê, która obsługuje zwykły tekst używając nenscriptu.

/etc/printcap wygląda tak:

#
# Apple LaserPrinter Select 360 on AppleTalk:
#
lp|Pingo LaserWriter|Theobald Chapin, III:\
        :sd=/usr/spool/theobald:\
        :lp=/dev/null:\
        :pl#61:\
        :pw#80:\
        :mx#0:\
        :sh:\
        :sf:\
        :lf=/var/adm/lpd-errs:\
        :if=/usr/local/bin/myif:\
        :of=/usr/local/atalk/etc/ofpap:
#
# Special setup for plain text files, to convert to PostScript using nenscript
# instead of psf (which doesn't process the whole ISO characterset)
#
text:\
        :sd=/usr/spool/textprinter:\
        :lp=/dev/null:\
        :mx#0:\
        :sh:\
        :sf:\
        :lf=/var/adm/lpd-errs:\
        :of=/usr/local/bin/textfilter:

/usr/local/bin/textfilter jest skryptem w powłoce:

#!/bin/sh
/usr/bin/nenscript -P lp -2 -r -T US -i "Werner Eugster"

Niestety nie znalazłem sposobu na zachowanie nazwy pliku do drukowania i dlatego używam opcji -i z moim nazwiskiem, żeby oznaczyæ wydruk. Może znajdziesz jakiś lepszy sposób używając np. Unix-owej zmiennej środowiskowej z loginem.

W tym ustawieniu otrzymujê tekst na papierze w układzie poziomym (opcja -r) w dwóch kolumnach (-2) wysłany na standardową drukarkê lp. Aby wydrukowaæ zwykły plik tekstowy używam polecenia

lpr -P text plain.txt

Tak wiêc przede wszystkim, drukarka zdefiniowana jako text zamienia zwykły tekstowy plik na PostScript używając nenscript (który obsługuje pełen zestaw znaków ISO), ktory przekazuje go dalej do drukarki zdefiniowanej jako lp. Przez to, używając polecenia lpq zobaczysz, że zadanie drukowania pojawi siê przy drukarce lp i przychodzącego ze standardowego wejścia, co jest poprawne.

Jeśli ktoś zna jakiś sposób, żeby umieściæ na wydruku nazwê pliku, to bêdê bardzo wdziêczny za tê informacjê !

moje ustawienia długości i szerokości strony sa ignorowane

To był mój błąd. Sprawdź czêśæ powyżej, gdzie opisujê myif. Musisz dodaæ $* dwa razy w drugiej linii w pliku, która teraz wygląda tak:

#!/bin/sh
/usr/local/bin/linebreak $* | /usr/local/atalk/etc/ifpap $*

zadanie jest wysłane do drukarki, ale nie zostaje wydrukowane

Jest wiele takich problemów. Jeden, o którym dowiedziałem siê od Paolo Supino to ten:

"Podczas krótkiej inspekcji wydruku z nbplkup (żeby zobaczyæ czy są tak jakieś dziwne rzeczy), zobaczyłem, że nasza drukarka na sieci ma ten sam numer co serwer NT (który kolejkuje zadania z PC-tów). To było źle.
1. Serwer NT jest bardzo złym spoolerem.
2. Powinien on kolejkowaæ tylko maszyny Windows-owe.
3. Pomimo tego, iż nie miał on przechwytywaæ wszystkiego co przez niego przeszło - on to robił.

Rozwiązanie: Wyłączyæ zupełnie serwer drukowania dla Mac-ów na NT. Wyedytowaæ plik .paprc w katalogu zadañ tak, żeby wskazywał on bezpośrednio na drukarkê. Zrestartowaæ komputer, żeby mu siê pamiêc odświeżyła.

moja drukarka nie bierze papieru z tego zasobnika, z którego ja chcê

Domyślnie wszystko jest drukowane na papierze ze standardowego zasobnika. Jeśli chcesz tak ustawiæ drukarkê, aby brała papier z innego zasobnika niż ze standardowego, to spróbuj tego:

Zmodyfikuj swój plik /usr/local/bin/myif i przepuśæ wszystko przez program awk, czy jakiś inny, który potrafi zapisaæ dodatkową liniê do strumienia po nagłówku.
Np. Ja spróbowałem tak:

#!/bin/sh
/usr/local/bin/linebreak $* | awk '{if(NR==1&&$1~"%!"){print;print
"statusdict begin /manualfeed true store end\n";}else{print}}' | /usr/local/atalk/etc/ifpap $*

(upewnij siê, że nie ma fizycznych łamañ linii w linii drugiej).
A informuje to drukarkê o tym, że ma wziąæ papier z podajnika rêcznego. Dla innych podajników zamieñ tekst w cuszysłowach ("statusdict begin /manualfeed true store end\n") na odpowiednie polecenie z tej listy:

Podajnik          |             Polecenie PostScriptu
------------------+---------------------------------------------------
przedni           | "statusdict begin 0 setpapertray end"
                  |
tylny             | "statusdict begin 1 setpapertray end"
                  |
automatyczny      | "statusdict begin /manualfeed true store end"

Polecenia PostScriptu do zdefiniowania wyjściowych "szufladek":

Szufladka         |              Polecenie PostScriptu
------------------+---------------------------------------------------
górna             | "0 statusdict /setoutputtray get exec"
                  |
dolna             | "1 statusdict /setoutputtray get exec"

Oczywiście jeśli chcesz zdefiniowaæ podajnik wejściowy i szufladkê wyjściową, to musisz wstawiæ dwie linie do pliku PostScriptowego.

Chociaż to działa dla wejścia, które już jest PostScriptem. Jeśli chcesz to osiągnąæ dla tekstu, który jest dopiero zamieniany na PostScript, to musisz zmodyfikowaæ plik psf.c i skompilowaæ nowy filtr psf. (nie zapomnij zainstalowaæ go w katalogu /usr/local/atalk/etc !). Wszystko co musisz zrobiæ, to znaleźæ liniê %%!PS-Adobe-2.0 (ok. linii 379, musi to byæ funkcja textps(). Dodaj nową liniê:

printf( "statusdict begin /manualfeed true store end\n" );

(i znowu - możesz zamieniæ tekst w cudzysłowach na ten, który ci odpowiada). Potem skompiluj ponownie psf i zainstaluj go.

Davis Goodman skoñczył na takim skrypcie myif, który sprawdza czy chcesz drukowaæ w rozmiarach listowych czy normalnych. Jeśli jest to normalny, to wykonywane jest polecenie PostScriptu powodujące wybór tylnego podajnika, w innym przypadku papier pobierany jest z podajnika standardowego.

#!/bin/sh
bounding=`grep BoundingBox $8 | cut -d" " -f5 `
if [ "$bounding" = "" ]; then
  /usr/bin/awk '{if(NR==1&&$1~"%!"){print;print "statusdict begin 1 setpapertray end\n";}else{print}}' | /usr/local/atalk/etc/ifpap $*
else
  /usr/local/atalk/etc/ifpap $*
fi

To działa z Netscape a twoje własne oprogramowanie może przyjmowaæ inne wartości. Załączyłem ten przykład tylko po to, żeby ci wskazaæ, gdzie należy zacząæ jeśli chcesz robiæ podobne sztuczki.

Jeszcze jeden przykład jest od Tomasa Pospiska, który zdefiniował nazwy drukarek dla różnych podajników w tej samej drukarce w /etc/printcap. Żeby wydrukowaæ na papierze z konkretnego podajnika wysyłasz zadanie na odpowiednią drukarkê. Jego printcap wygląda tak:

# LaserWriter Pro 630 (Default Tray)
lp:\
        :sd=/usr/spool/lp1:\
        :lp=/dev/null:\
        :pl#63:pw#85:\
        :mx#0:\
        :sh:sf:\
        :lf=/var/log/lp-errs:\
        :if=/usr/lib/atalk/filters/myif:\
        :of=/usr/lib/atalk/filters/ofpap:
#
# LaserWriter Pro 630 (Manual Tray)
lpm:\
        :sd=/usr/spool/lpm:\
        :lp=/dev/null:\
        :pl#63:pw#85:\
        :mx#0:\
        :sh:sf:\
        :lf=/var/log/lp-errs:\
        :if=/usr/lib/atalk/filters/myif_manual:\
        :of=/usr/lib/atalk/filters/ofpap:

a filtr myif wygląda tak:

#!/bin/sh
/usr/bin/awk '{if(NR==1&&$1~"%!"){print;print "statusdict begin
/manualfeed true store end\n";}else{print}}' |
/usr/lib/atalk/filters/ifpap $*

Jak dotąd dostałem konstruktywne komentarze i pytania od ludzi z

COM domena              11
EDU (USA)               12
US domena (USA)         1
GOV domena USA          2
NET domena              1

Australia               1
Austria                 2
Belgia                  1
Francja                 2
Niemcy                  5
Islandia                1
Włochy                  3
Japonia                 1
Holandia                1
Portugalia              2
Wileka Brytania         1
Szwajcaria              1

© 13 Marca 1997 Werner Eugster ( eugster@giub.unibe.ch)


Następna strona Poprzednia strona Spis treści