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)