bookmaker.bash: Script para imprimir livros com 4 páginas em uma folha
Publicado por albert guedes 20/06/2008
[ Hits: 8.598 ]
Homepage: https://teko.net.br
Finalmente saiu! Depois do fiasco do meu primeiro script para imprimir em forma de booklets, esse script consegue imprimir 4 páginas em uma folha e coloca na ordem certa para imprimir livros.
É só rodar o script dando o nome do pdf, mandar imprimir frente e verso e PIMBA ! É só mandar encadernar.
Eu testei este script com pdfs de até 1000 páginas, mas se houver problemas, por favor me avisem.
#!/bin/bash
# Permição de uso via GPL - http://www.gnu.org/licenses/gpl.txt
# bookmaker.bash - Script para imprimir 4 páginas em uma folha de papel,
# com duas páginas em cada lado da folha.
# Ideal para impressão de livro e economizar.
# Versão: 2.0
# Data da versão: 6 de maio de 2008
# Autor: Albert R. C. Guedes
# Contato: email: arcguede@gmail.com
# albertguedes@hotmail.com
# site : socrates.if.usp.br/~arcguede
# Notas da versão:
#
# - acrescentado uma opção de nomeação de arquivo de saida mais decente
# e menos ignorante.
# - corrigido o problema de numeração das páginas, agora levando
# em consideração o numero de digitos totais, como 1000 que tem
# quatro digitos, 100 tem três e 10 tem dois.
# - agora é usado o diretorio '/var/tmp' em vez de '/tmp' para os
# arquivos temporarios, pois este se mostrou mais rápido para
# trabalhar.
# - se sobrar uma última página de resto, agora ela será realmente a
# última.
#
# Dependencias: pacote pdfjam - pdfnup, pdf90 e pdfjoin.
# pacote tex - latex, dvipdf
# pacote xpdf - pdfinfo
#
#
# Inicio do script.
#
# 'FILE' guarda o nome do arquivo que se deseja modificar.
# Aqui 'FILE' toma o valor do primeiro argumento como
# nome do arquivo a ser modificado caso não tenha sido
# usado a opção '-o'.
FILE=$1
# Caso seja dada a opção '-o' de nome para o arquivo final,
# 'FILE' toma o valor do segundo argumento que é o nome do
# arquivo que se deseja modificar.
if [ "$1" == '-o' ]
then
FILE=$2
else
# 'OUTPUT' será o nome do arquivo pdf final.
OUTPUT=$( echo "$FILE" | sed -e 's/\\..*$//g' )
OUTPUT="out-$OUTPUT.pdf"
fi
# Pega o nome do diretório atual.
DIR=$( pwd )
# Pega o número de páginas do arquivo.
PAGES=$( pdfinfo $FILE | grep Pages | cut -d' ' -f11- )
# Extrai as páginas do arquivo uma por uma.
for((i=1;i<=$PAGES;i++))
do
pdfnup --nup 1x1 --pages $i --outfile /tmp/page$i.pdf $FILE
done
cd /tmp
# Calcula a página do meio.
MEAN=$(($PAGES/2))
# 'FLAG' é para indicar o sentido de rotação das páginas.
FLAG=0
# 'idx' é contador de novas páginas.
idx=0
for((i=1;i<=$MEAN;i++))
do
# 'i' é pagina que fica a direita da folha, e 'j' a da esquerda.
j=$((2*$MEAN-$i+1))
let idx++
# 'PG' é o número do arquivo pdf que contem a página 'idx'.
# Caso o livro tenha entre 100 e 999 páginas, o 'PG' fica na forma de 3 dígitos.
[ $PAGES -lt 1000 -a $PAGES -ge 100 ] && {
PG=$idx
[ $idx -lt 100 ] && PG="0$idx"
[ $idx -lt 10 ] && PG="00$idx"
}
# Caso o livro tenha entre 10 e 99 páginas, o 'PG' fica na forma de 2 dígitos.
[ $PAGES -lt 100 -a $PAGES -ge 10 ] && {
PG=$idx
[ $idx -lt 10 ] && PG="0$idx"
}
# Caso o livro tenha entre 0 e 9 páginas, o 'PG' fica na forma de 1 dígitos.
[ $PAGES -lt 10 ] && PG=$idx
if [ $FLAG -eq 0 ]
then
# Junta duas páginas em um arquivo.
pdfjoin page$j.pdf page$i.pdf --outfile A.pdf
rm page$i.pdf page$j.pdf
# Junta duas páginas em uma só folha.
pdfnup A.pdf --outfile B.pdf
rm A.pdf
# Como a 'FLAG' é 0, a rotação é em sentido horário.
pdf90 B.pdf --outfile A.pdf
rm B.pdf
pdf90 A.pdf --outfile B.pdf
rm A.pdf
pdf90 B.pdf --outfile page-$PG.pdf
rm B.pdf
FLAG=1
else
# Junta duas páginas em um arquivo.
pdfjoin page$i.pdf page$j.pdf --outfile A.pdf
rm page$i.pdf page$j.pdf
# Junta duas páginas em uma só folha.
pdfnup A.pdf --outfile B.pdf
rm A.pdf
# Como a 'FLAG' é 1, a rotação é em sentido anti-horário.
pdf90 B.pdf --outfile page-$PG.pdf
rm B.pdf
FLAG=0
fi
done
# Caso o número de páginas seja impar, vai sobrar uma última página.
if [ $(($PAGES-2*$MEAN)) -eq 1 ]
then
# Nesta parte, caso exista um número impar de páginas, irá sobrar uma no final.
# Por isso, é criado uma folha de PDF em branco e juntado a pagina que sobrou.
# # #
echo "\documentclass[12pt,a4paper]{article}\begin{document}\end{document}" > blank.tex
latex blank.tex
dvipdf blank.dvi blank.pdf
# # #
pdfjoin blank.pdf page$PAGES.pdf --outfile A.pdf
rm blank* page$PAGES.pdf
# Junta as duas páginas, a branca e o resto, em uma folha só.
pdfnup --nup 2x1 A.pdf --outfile B.pdf
rm A.pdf
# Rotaciona em sentido anti-horário.
pdf90 B.pdf --outfile A.pdf
rm B.pdf
# Junta tudo num arquivo só.
pdfjoin page-*.pdf A.pdf --outfile $DIR/$OUTPUT
rm page-*.pdf A.pdf
else
# Junta tudo num arquivo só.
pdfjoin page-*.pdf --outfile $DIR/$OUTPUT
rm page-*.pdf
fi
echo -e "\n\n Pronto !\n\n"
#
# Fim do script.
#
Backup com dump, restore, sendmail e log completo
POSTFIX AUTOMÁTICO COM MYSQL E IPTABLES - RESTAURANDO MBOX VIA SSH
Instalação completa de servidor de e-mail
Script FIREWALL IPTABLES com 3 (três) interfaces (Int, Ext e DMZ)
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como fazer a conversão binária e aplicar as restrições no Linux
Como quebrar a senha de um servidor Linux Debian
Como bloquear pendrive em uma rede Linux
Um autoinstall.yaml para Ubuntu com foco em quem vai fazer máquina virtual
Instalar GRUB sem archinstall no Arch Linux em UEFI Problemático









