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)
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.
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.
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 !
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ê !
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 $*
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.
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)