bookmaker.bash: Script para imprimir livros com 4 páginas em uma folha
Publicado por albert guedes 20/06/2008
[ Hits: 8.535 ]
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.
#
Script para fazer funcionar o bloqueio por horário - Squid
Administração de VirtualBox com ShellScript
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Preciso recuperar videos *.mp4 corrompidos (10)
É normal não gostar de KDE? (11)
Secure boot, artigo interessante, nada técnico. (2)









