bookmaker.bash: Script para imprimir livros com 4 páginas em uma folha

Publicado por albert guedes 20/06/2008

[ Hits: 8.150 ]

Homepage: https://teko.net.br

Download bookmaker.bash




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.

  



Esconder código-fonte

#!/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.
#

Scripts recomendados

SCRIPT PARA INSTALAÇÃO DE PROGRAMAS NO LINUX

Liberação do servidor DNS no firewall

Monitorando seus daemon de impressão...

ipshow - exibir informações de sua rede

Enviar via FTP todos as pastas / sub-pastas e arquivos, a partir do diretorio de origem inclusive


  

Comentários
[1] Comentário enviado por xjc em 21/06/2008 - 03:38h

você podia ter colocado comentado como instalar esses pacotes que você diz que precisa ,

[2] Comentário enviado por albertguedes em 21/06/2008 - 09:10h

Oi xjc. O problema é que cada distro tem seu modo proprio de instalar pacotes.
Como uso Debian por exemplo eu consigo abaixar todos pelo aptitude, quem usa Fedoa usa yum , e por ai vai. Temos bons artigos e dicas aqui no VOL que podem te auxiliar nesse sentido, dá uma pesquisada.
Mas se tiver qualquer duvida, pode falar comigo, falou ? Até mais.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts