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
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 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
Melhorando o tempo de boot do Fedora e outras distribuições
Como instalar as extensões Dash To Dock e Hide Top Bar no Gnome 45/46
E a guerra contra bots continua
Tradução do artigo do filósofo Gottfried Wilhelm Leibniz sobre o sistema binário
Conheça o firewall OpenGFW, uma implementação do (Great Firewall of China).
Instalando o FreeOffice no LMDE 6
Anki: Remover Tags de Estilo HTML de Todas as Cartas
Colocando uma opção de redimensionamento de imagem no menu de contexto do KDE
Não consigo acessar os modos de desempenho (2)
Ubuntu — tentando iniciar o windows? (0)
[Shell Script] Script para desinstalar pacotes desnecessários no OpenSuse
[Shell Script] Script para criar certificados de forma automatizada no OpenVpn
[Shell Script] Conversor de vídeo com opção de legenda
[C/C++] BRT - Bulk Renaming Tool
[Shell Script] Criação de Usuarios , Grupo e instalação do servidor de arquivos samba