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

Publicado por albert guedes 20/06/2008

[ Hits: 8.261 ]

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

Administração de Usuários

Trocando plano de fundo no flux de forma gráfica

Envio de backps de bancos por ftp com notificação por email

Desligando infraestrutura de ITM6

Criando arquivos de in e out no CBQ


  

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