bookmaker.bash: Script para imprimir livros com 4 páginas em uma folha
Publicado por albert guedes 20/06/2008
[ Hits: 8.414 ]
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. #
Tradução de endereços de uma rede interna
Instalar o Java diretamente do site oficial
Aprenda a Gerenciar Permissões de Arquivos no Linux
Como transformar um áudio em vídeo com efeito de forma de onda (wave form)
Como aprovar Pull Requests em seu repositório Github via linha de comando
Aplicativo simples para gravar tela
Quebra de linha na data e hora no Linux Mint
Firefox não abre em usuário não administradores (0)
Sempre que vou baixar algum pacote acontece o erro dpkg (8)
tentando instalar em um notebook antigo o Linux LegacyOS_2023... [RESO... (8)