No dobra! rozprawiłem się z tym ustroństwem i mamy
skrypt do drukowania książek i dużych dokumentów!
Skrypt jest prosty w obsłudze: przyjmuje on od 1 od 3 parametrów:
1) ilość stron jaka ma się znajdować na 1 karce 1|2|4|8|9
parametr opcjonalny, domyślna wartość: 2
2) jednostronne drukowanie
s lub dwustronne
d lub książka
b parametr opcjonalny, domyślna wartość: jednostronnie
3) nazwa pliku do druku
parametr obowiązkowy
Przykłady użycia:
drukuj 4 d /plik/do/druku (dwustronnie , po 4 str. na kartkę)
drukuj 2 d /plik/do/druku (dwustronnie , po 2 str. na kartkę)
drukuj 2 s /plik/do/druku (jednostronnie , po 2 str. na kartkę)
drukuj /plik/do/druku (jednostronnie , po 2 str. na kartkę)
drukuj b /plik/do/druku (w formie książki , po 2 str. na kartkę)
Drukować można dowolny plik, w środku program '
a2ps' (any to PostScript) zamini go na plik.ps.
Testowałem to na duzych pdf'ach i działa prawidłowo.
Oto on:
Code: Select all
#!/bin/sh
#r="-r"
mode_ok=0;
mode="s"
pages_ok=0;
pages="2";
options="--encoding=iso-8859-2";
A2PS="/usr/bin/a2ps"
PSSELECT="/usr/bin/psselect"
LPR="/usr/bin/lpr"
BASENAME="/bin/basename"
RM="/bin/rm"
DN="/dev/null"
file_to_print="-1";
usage(){
echo " usage: $0 [opcje] /plik/do/druku";
echo " Jesli nie podasz opcji, plik zostanie wydrukowany"
echo " jednostronnie, po dwie strony na kartce";
echo " Przykłady:";
echo " drukowanie książki : $0 b /plik/do/druku";
echo " drukowanie dwustronne po 4 stony na kartce : $0 4 d /plik/do/druku";
echo " drukowanie jednostronne po 2 stony na kartce: $0 2 s /plik/do/druku";
echo " : $0 /plik/do/druku";
exit;
}
print_D(){
FILEODD=`$BASENAME ${file_to_print}odd.ps`
FILEEVEN=`$BASENAME ${file_to_print}even.ps`
while [ -e $FILEODD ]
do
FILEODD="1${FILEODD}";
done
while [ -e $FILEEVEN ]
do
FILEEVEN="1${FILEEVEN}";
done
$A2PS $file_to_print $options 2>$DN | $PSSELECT -o > $FILEODD
echo "----------------------------------------------------------------"
$LPR $FILEODD
echo "Nieparzyste strony własnie są w druku. Kiedy to się skończy włóz";
echo "te kartki spowrotem do podajnika i nacisnij ENTER 2 razy"
echo "----------------------------------------------------------------"
read x;
echo "Nacisnij jeszcze raz, by kontynuować"
read x;
echo "----------------------------------------------------------------"
$A2PS $file_to_print $options 2>$DN | $PSSELECT -e $r > $FILEEVEN
$LPR $FILEEVEN
echo "----------------------------------------------------------------"
echo "Wysyłam do druku parzyste strony..."
if [ -f $FILEEVEN ]
then
$RM $FILEEVEN
fi
if [ -f $FILEODD ]
then
$RM $FILEODD
fi
echo "Koniec :)";
}
print_S(){
$A2PS $file_to_print $options -d 2>$DN
}
print_book(){
PSBOOK="/usr/bin/psbook"
PSNUP="/usr/bin/psnup"
FILE=$file_to_print;
echo "drukuje $FILE";
A2PS_OPTIONS="--columns=1 -q"
PSNUP_OPTIONS="-2 -q"
PSBOOK_OPTIONS="-q"
PSSELECT_OPTIONS="-q"
BASENAME="/bin/basename"
BOOK=`$BASENAME ${FILE}book.ps`
$A2PS $FILE $A2PS_OPTIONS | $PSBOOK $PSBOOK_OPTIONS | $PSNUP $PSNUP_OPTIONS > $BOOK
$PSSELECT -o $PSSELECT_OPTIONS $BOOK | $LPR
echo "Po skończeniu drukowania przełóż kartki spowrotem do podajnika\ni naciśnij ENTER"
read x;
echo "Nacisnij jeszcze raz, by kontynuować"
read x;
$PSSELECT -e $PSSELECT_OPTIONS $BOOK | $LPR
$RM $BOOK
}
if [ $# -gt 3 ] || [ $# -lt 1 ]
then
usage;
fi
for i in $@
do
case $i in
[[:digit:]])
if [ $pages_ok -eq 1 ]
then
echo "Zla opcja \"$i\"";
exit
else
pages=$i;
case $pages in
1|2|4|8|9)
pages_ok=1;
;;
*)
echo "Przyjmuje tylko 1|2|4|8|9";
exit
;;
esac
fi
;;
[[:alpha:]])
if [ $mode_ok -eq 1 ]
then
echo "Zla opcja \"$mode\"";
exit;
else
mode=$i;
case $mode in
s|d|b)
;;
*)
echo "Zla opcja \"$mode\"";
exit;
esac
mode_ok=1;
fi
;;
*)
if [ -e $i ] && [ -f $i ]
then
file_to_print=$i
else
echo "Zla opcja \"$i\"";
exit;
fi
;;
esac
done
if [ -e $file_to_print ] && [ -f $file_to_print ]
then
echo "----------------------------------------------------------------"
echo "Plik do druku : \"$file_to_print\"";
else
echo "Brak pliku do druku";
exit;
fi
echo "Stron na kartce : $pages";
case $pages in
1|4|9)
options="$options -R$pages"
;;
*)
options="$options -r$pages"
;;
esac
if [ "$mode" = "s" ]
then
echo "Mode : simplex";
echo "----------------------------------------------------------------"
print_S;
fi
if [ "$mode" = "d" ]
then
echo "Mode : duplex";
echo "----------------------------------------------------------------"
print_D;
fi
if [ "$mode" = "b" ]
then
echo "Mode : book";
echo "----------------------------------------------------------------"
print_book;
fi
Skrypt jest długi, bo odporny na bezsensowne dane wejsciowe (mam nadzieje) i kolejność argumentów jest dowolna.
Mogłem coś zjeść wklejając go na strone, więc źródlo udostępniam również tu:
http://dylag.pl/download/drukuj
cały czas skrypt jest uaktualniany i ulepszany, więc
aktualna wesrja jest dostępna pod powyższym adresem
Mam nadzieje, ze komuś się przyda. Dzięki niemu oszczędza się papier i tusz.
Jeżeli na wydruku są krzaki, to może to byc spowodowane:
a) drukarka nie rozumie postskryptu
b) a2ps błędnie tworzy pliki postskryptowe
Jeżeli drukowanie dwustronne jest OK, ale na odwrocie pierwszej strony jest ostatnia , zamiast drugiej, wtedy należy odkomentować linijkę (na samej górze skryptu):
#r="-r";
Wszelkie komentarze, krytyka i pochwały mile widziane 