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
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. #
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
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
É cada coisa que me aparece! - não é só 3% (2)
SysAdmin ou DevOps: Qual curso inicial pra essa área? (1)
Alguma pessoa pode me ajudar com drriver Core i3 7020u (Debian 12)? (2)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta