# [HOWTO] drukowanie dużych dokumentów

## misterLu

Jak oszczędnie wydrukować duży plik jako książkę? Czytaj pięć postów niżej.

W Windows mamy do tego finePrint, a tu musimy go sobie złożyć sami programów wchodzących w skład pakietu psutils, czyli zaczynamy od:

```
#emerge psutils
```

Jeżeli nasz plik jest formatu *.doc, lub cokolwiek, co jest w stanie otworzyć OpenOffice, to należy ten plik za pomocą OpenOffice'a otworzyć i eksportować do formatu .pdf:

W tym celu w OpenOffice wybieramy z menu File->Export as pdf. Teraz mamy już gotowy plik.pdf do wydrukowania.

Teraz już tylko trzeba podzielić plik na strony, zmniejszyć je tak, by wchodziły po dwie na strone i wydrukować, czyli wykonujemy:

```

a2ps NaszPlik.pdf --columns=1 >a.ps

psbook a.ps | psnup -2 > ksiazka.ps

psselect -o ksiazka.ps > ksiazka-odd.ps

psselect -e ksiazka.ps > ksiazka-even.ps

lpr kisazka-odd.ps

TU PRZEKŁADAMY KARTKI SPOWROTEM DO PODAJNIKA

lpr kisazka-even.ps

```

I mamy pięknie wydrukowany dokument w formacie książki. 

Problem w tym, że te komendy są upierdliwe, wiec zapisałem je wszystkie do 

jednego skryptu, dzięki czemu nie musimy pamiętać tych wszystkich komend.

Oto źródło skryptu:

```

#!/bin/sh

A2PS="/usr/bin/a2ps"

PSSELECT="/usr/bin/psselect"

LPR="/usr/bin/lpr"

RM="/bin/rm"

PSBOOK="/usr/bin/psbook"

PSNUP="/usr/bin/psnup"

FILE=$1

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;

$PSSELECT -e  $PSSELECT_OPTIONS $BOOK | $LPR

$RM $BOOK

```

Wystarczy zapisać to jako plik print.sh

Nadać mu prawa wykonywalne:

```
#chmod a+x print.sh
```

i można cieszyć się drukowaniem:

```
./print.sh MaszPlik.pdf
```

W odpowiednim momencie skrypt poprosi nas o przełożenie wydrukowanych kartek sporwotem do podajnika i naciśniećie klawisza ENTER

Za pomocą jednej komendy możemy mieć pięknie wydrukowany plik.

Łatywiej chyba czytać coś, co ma format książki, niż luźne kartki, gdzie strona tekstu ma format A4.Last edited by misterLu on Sun Dec 26, 2004 1:06 am; edited 5 times in total

----------

## POLAX

Pszepraszam bo nie pise dobze po Polsku.

Jak zcompilujesz desktop manager xfce4 to on ma program "xfprint4" ktury daje takie optcie...

----------

## szaman

Próbuję właśnie okiełznać taką metodę, ale mam problemy chyba ze swoją drukarką.

Zakładając, że masz postscripta do wydrukowania (plik.ps), spróbuj czegoś takiego:

1. 

```
psbook -q -sNN <plik.ps | psnup -n2 | psselect -o -q -p1- >plik.nieparzyste.ps
```

2. drukujesz plik.nieparzyste.ps, po czym odwracasz odpowiednio kartki w drukarce (wymaga poeksperymentowania)

3. 

```
psbook -q -sNN <plik.ps | psnup -n2 | psselect -e -r -q -p1- >plik.parzyste.ps
```

4. drukujesz plik.parzyste.ps

PS. NN to liczba stron w plik.ps zaokrąglona do o ile się nie mylę 4 w zwyż.

Daj znać, jeśli coś z tego wyciśniesz :)Last edited by szaman on Wed Apr 29, 2009 10:12 pm; edited 1 time in total

----------

## misterLu

Podoba mi sie! i to bardzo!! 

Przeczytam to dokładnie i postaram sie z tego i z xprint zrobić jakiś sensowny skrypt (jak tylko znajde troche czasu wolnego). Szkoła goni ...  :Sad: 

----------

## misterLu

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:

```

#!/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  :Wink: [color=blue]Last edited by misterLu on Sun Dec 26, 2004 1:13 am; edited 3 times in total

----------

## zalun

cos nie za bardzo z tym plikiem dziala

403 Forbidden error was encountered

----------

## yemu

czy moznaby jakos przerobic ten skrypt zeby dalo sie na nim drukowac rzeczy do zszycia w połowie. czyli na jednej kartce sa np 1,2,ostatnia i przedostatnia strona.? albo chociaz tak, zeby moznabylo A4 przcciac na A5 i sobie zbindowac?

pozdro

y

ps. lece sprawdzac czy mi w ogole dziala  :Smile: 

----------

## misterLu

Przepraszam, miałem problemy techniczne i nie wszystko przywróciłem.

Skrypt już jest tu: http://dylag.pl/download/drukuj

w pierwotnym poscie poscie tez poprawiłem adres

----------

## zalun

ale fajny skrypcik BTW. chyba w nim pogrzebie (kwestia wyboru wielkosci papieru by sie przydala)

----------

## misterLu

ciesze sie , ze komuś się przydał. powstał, bo stery od windy się waliły i przy dwustronnym drukowaniu dziwy się działy. Sam bym go chętnie wzbogacił, ale teraz nie mam czasu. Graficzna nakładka to zbytek, ale marginesami mógłbyś pomanipulować i kreską oddzielającą strony, bo z tego , co pamiętam, to nie dzieliła ona strony na połówki.

----------

## liu

Przepraszam, czy moze ktos juz zmajstrowal przerobke tego skrypciku tak, zeby drukowal do zszycia (pierwsza-ostatnia itp.)?  :Smile:  Przymierzam sie do zrobienia, ale nie chce wywazac otwartych drzwi  :Wink: 

----------

## argasek

 *POLAX wrote:*   

> Pszepraszam bo nie pise dobze po Polsku.
> 
> Jak zcompilujesz desktop manager xfce4 to on ma program "xfprint4" ktury daje takie optcie...

 

A jak jest jeśli chodzi o KDE/GNOME, bo jeszcze nie interesowałem się tematem?

----------

## misterLu

 *liu wrote:*   

> Przepraszam, czy moze ktos juz zmajstrowal przerobke tego skrypciku tak, zeby drukowal do zszycia (pierwsza-ostatnia itp.)?  Przymierzam sie do zrobienia, ale nie chce wywazac otwartych drzwi 

 

Na górze strony był oddzielny skrypt do drukowania książek, ale w sumie sensowniej będzie załącyć go jako opcję do skryptu głównego. I tak uczyniłem. Doszła nowa opcja b, która pozwala drukować dokumenty jak książki. Oczywiście werjsa aktualna jest tu:http://dylag.pl/download/drukuj

Nie ukrywam, że pare kartek zużyłem na testy, a jednego nie udało mi się znaleźć- mianowicie, jak ustawić drukowanie z nagłówkiem??!! --header= ???? Nie chce mi ta opcja działać.

----------

## kuku

może by tak dodać do opisu druku ksiażek w skrypcie żeby pierwszą kartke ludzie wkładali grubszą - wtedy będzie ładna okładka   :Wink: 

----------

## msch

[404] File Not Found : Plik nie istnieje

co z tym linkiem?  :Wink:  chcialem przetestowac ...

=edit=

pozatym chyba czas na update:

```

emerge a2ps

```

----------

## tuniek

```
emerge xpp
```

bardzo fajny program. Obsługuje większość znanych formatów i w połączeniu z cups-ami działa wyśmienicie.

----------

## kuku

odkurzę nieco temat  :Wink: 

wyszło Dive into python po polsku http://pl.wikibooks.org/w/index.php?title=Python/Wersja_do_druku&printable=yes - kiedys próbowalem to drukować po angielsku i miałem, ten sam problerm co teraz, mianowicie jeśli juz mi scali po 2 strony na 1 kartke to prawa trochę wystaje i obcina mi literki - przydałaby się możliwość ustawienia marginesu

edit: doszedłem w czym lezy problem - a2ps nie robi marginesów - jeśli skonwertuje najpierw samemu dokument do *.ps (np drukuj do pliku PS) i wywale ze skryptu $A2PS to drukuje dobrze - pewnie trzeba podać do a2ps jakieś dodatkowe opcje - jak do tego dojdę to napiszę

----------

