bookmaker.bash: Script para imprimir livros com 4 páginas em uma folha
Publicado por albert guedes 20/06/2008
[ Hits: 8.532 ]
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.
#
Conversor de arquivos de vídeo (Video Converter)
ipshow - exibir informações de sua rede
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?
Instalação dualboot Windows 11 e Debian 13 (4)
Mint Xfce não mantém a conexão no wi-fi (0)
Programa fora de escala na tela do pc (36)
Eu queria adicionar a incon do wifi e deixa transparente no fluxbox no... (0)









