bookmaker.bash: Script para imprimir livros com 4 páginas em uma folha
Publicado por albert guedes 20/06/2008
[ Hits: 8.284 ]
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. #
Instale o driver proprietário Nvidia baixado do site oficial em qualquer distro
Executando comandos remotos via Dropbox
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
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
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Servidor said: 530 5.7.0 Must issue a STARTTLS command first (in r... (1)
Plasma 6 com partes em inglês (0)
Erro no upgrade: Sub-process /usr/bin/dpkg returned an error code (1) ... (3)
Falta pacotes de suporte ao sistema de arquivos (Gerenciador de discos... (6)