LINUX.ORG.RU

[bash][script]печать книжкой

 ,


0

1

Думаю не однократно многим хотелось распечатать некий документ в формате книги. Посему представляю на рассмотрение общественности скрипт, позволяющий автоматизировать это действие.

#!/bin/bash

#CONVERT_PDF_TO_PS=pdf2ps
CONVERT_PDF_TO_PS=pdftops



if [ ! -f "$1" ];
then
  printf "Пример использования программы:\n\t$0  файл_формата_postscript.ps"
  exit;
fi

if [ ! -r "$1" ];
then
  printf "Не могу прочесть файл \"$1\"\n"
  exit;
fi

ext=${1##*.}
name=`basename "$1" ".$ext"`
if [[ ps != "$ext" ]];
then

    if [[ pdf != "$ext" ]];
    then
      printf "Предложенный файл не является файлом PostScript или PDF \"$1\"\n"
      exit;
    fi
fi

# количество листов бумаги в тетрадке
VAR_T=15
# количество страниц текста в тетрадке = 
VAR_S=$[${VAR_T} * 4]
printf "${VAR_S}\n"

tmpfile=`basename $1`.XXX
tmpfile=`mktemp -t ${tmpfile}` || exit 1 
printf "$tmpfile\n"

if [[ pdf == "$ext" ]];
then
    $CONVERT_PDF_TO_PS $1 $tmpfile
fi


# добавляем, если требуется нужные пустые листы в конец документа
psbook $1 $tmpfile -q
        
# чтение количества страниц в файле
countpages=`head -n 30 $tmpfile |grep '%%Pages:' | (read p1 countpages; printf $countpages)`
printf "количества страниц в файле $countpages\n"

# расчет количества тетрадей
count_tetradi=$[$countpages / ${VAR_S}]
if [ $[ $count_tetradi * ${VAR_S}] -lt $countpages ];
then
  count_tetradi="$[ $count_tetradi + 1 ]"
fi
printf "количество тетрадей $count_tetradi\n"


#разбиваем на тетради
for k in `seq 1 $count_tetradi`; do
  i=$[ $k*${VAR_S} - ${VAR_S} + 1]
  j=$[ $k*${VAR_S}]
  printf "Обработка страниц с $i по $j - тетрадь № $k\n"
  #psselect -p$i-$j $tmpfile `pwd`/part_$i-$j_`basename $1`
  psselect -q -p$i-$j $tmpfile | psnup -2 -q | ps2pdf - `pwd`/lists_"$i"-"$j"_`basename $1 .ps`.pdf
done
rm $tmpfile

Скрипт формирует несколько файлов pdf из одного. В каждом полученном файле находится одна из тетрадей для сшивки книги.

Автоматической отправки книги на печать не стал делать специально ( не у всех дуплекс стоит ).

Думаю предусмотреть дополнительное разделение на четные и нечетные страницы, но пока не решил нужно ли именно в данном скрипте.

Жду ваших комментариев.

★★★★★

Последнее исправление: Atlant (всего исправлений: 2)

Не читал, но думаю там ничего нового

$ cat make_pdf_book.sh 

#! /bin/sh

if [ $# -lt 1 ]; then
        echo "Usage: $0 <filename.ps>"
        exit 1
fi

INAME="$1"
ONAME=`basename $INAME .ps`
TMP1=$ONAME.tmp1
TMP2=$ONAME.tmp2
ONAME=$ONAME.pdf

psbook -s28 $INAME $TMP1
psnup -pa4 -2 $TMP1 $TMP2
ps2pdf -sPAPERSIZE=a4 $TMP2 $ONAME

rm -f $TMP1 $TMP2
sdio ★★★★★
()

Использую обычную печать + брошюратор. И ТС то же самое советую.

balodja ★★★
()
Ответ на: комментарий от Led

Led, что то гугол в замешательстве, расшифруй plz.

ALL, основное отличие от приведенных примеров это введение нескольких тетрадей в книге вместо одной. Можно просто согнуть листы и прошить их в корешок.

Atlant ★★★★★
() автор топика
Ответ на: комментарий от Atlant

P.S. в замешательстве от команды «psbl»

Atlant ★★★★★
() автор топика
Ответ на: комментарий от Atlant

Atlant> основное отличие от приведенных примеров это введение нескольких тетрадей в книге вместо одной.

Да ты че?! А psbook -s28 что по твоему делает.

Иди читай man psbook

sdio ★★★★★
()
Ответ на: комментарий от sdio

блин, я читал, но не понял сразу, думал это связано с чем то вроде подписи документов.
Спасибо за подсказку.

Тогда действительно скрипт не нужен.

Atlant ★★★★★
() автор топика

Я использовал когда-то вот это скрипт

# PRINTBOOK
#!/bin/sh
# this script has been written by Eddy 
#
#		printbook
#
# Создан 17-го Июнь 2004 года в 22:36
#
#    Prints a .ps file into book /32 pages, by pamphlets even-odd(revercive)
tmp=/tmp/printbook.$$
tmp1=/tmp/printbook1.$$
echo "Число страниц (кратно 4):"
read numb
book_table -f $numb

while read first
do
    if [ "$first" = "" ]; then
	echo -e "\n\t\t\t\aСледующая тетрадь"
	read null < /dev/tty
	continue
    fi
    psselect -p$first $1 $tmp 2> /dev/null
    psnup -2 $tmp $tmp1 2> /dev/null
    lpr $tmp1
    echo -e "\tПереверни пачку"
    read null < /dev/tty
    read second
    psselect -p$second $1 $tmp 2> /dev/null
    psnup -2 $tmp $tmp1 2>/dev/null
    lpr $tmp1
done < table
echo -e "\n\nЗавершили"
read null < /dev/tty
rm table
rm $tmp
rm $tmp1
//BOOK_TABLE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//use: tofile [-f] <total pages> [pages-in-pamphlet]
FILE* f;
int i,total,b,ii,ost,tp;
int tostd=1;//if prints to std -- adds comments to it

void first(int N, int i)
{
        int tp4 = (int)N/4;
	if (tostd)
	    printf("\tside # 1\n");
	fprintf(f,"\n");
	for (ii=1; ii<tp4; ii++){
	    fprintf(f, "%d,%d,", tp*i+N-2*ii+2, tp*i+2*ii-1);
	}
        fprintf(f, "%d,%d", tp*i+N-2*tp4+2, tp*i+2*tp4-1);	
	fprintf(f,"\n");
}

void second(int N, int i)
{
	int tp4 = (int)N/4;
	if (tostd)
	    printf("\tside # 2\n");
	for (ii=1; ii<tp4; ii++){
	    fprintf(f, "%d,%d,", tp*i+2*tp4-2*ii+2, tp*i+2*tp4-1+2*ii);
	}
        fprintf(f, "%d,%d", tp*i+2, tp*i+4*tp4-1);
	fprintf(f,"\n");
}

int main(int argc, char** argv)
{
    if ( strcmp(argv[1], "-f") == 0 ){
        f = fopen("table", "w");
	--argc;
	++argv;
	tostd=0;
        }
    else f = stdout;	
    total=atoi(argv[1]);
    tp=32;
    if ( argc > 2)
	tp=atoi(argv[2]);
    b = (int)total/tp;
    ost=total%tp;
    if (ost%4 > 0 || tp%4 >0){
	fprintf(stderr, "Число страниц не делится на 4");
	exit(1);
	}
    for (i=0; i < b; i++){
	if (tostd)
	    printf("\nТетрадь # %d\n", i+1);
	first(tp,i);
	second(tp,i);
    }
    if ( ost>0 ){
        if (tostd)
	    printf("\nПоследняя тетрадь'\n");
	first(ost,b);
        second(ost,b);
    }
    fclose(f);
}
Делал через одно место, т.к. psbook работал криво.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Atlant

psbl - из пакета impose+

psselect - из пакета psutils

Led ★★★☆☆
()
Ответ на: комментарий от Eddy_Em

>psbook работал криво.

Я тоже это давно заметил. Поэтому использую impose+

Led ★★★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.