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