ARSPDF - Programa para manipular arquivos PDF
Publicado por Alexandre Rodrigues dos Santos (última atualização em 11/11/2023)
[ Hits: 3.321 ]
Manipulação de arquivos PDF, utilizando o utilitário pdftk.
É possível dividir, juntar, extrair e rotacionar páginas em um arquivo PDF.
#!/bin/bash
#declaração de funções
#função para desenho do cabeçalho
function des_cabecalho(){
echo '+==================================================================================================+'
echo '| |||||||| |||||||| ||||||||| |||||||| |||||||||| |||||||| |'
echo '| || || || || || || || || || || || |'
echo '| || || || || || || || || || || |'
echo '| || || || || || || || || || || || |'
echo '| |||||||||| ||||||||| |||||||||| ||||||||| || || |||||||| |'
echo '| || || || || || || || || || || |'
echo '| || || || || || || || || || |'
echo '| || || || || || || || || || |'
echo '| || || || || ||||||||| || |||||||||| || |'
echo '+==================================================================================================+'
echo '| alexandre.arscm@gmail.com |'
}
#função para mostrar o menu principal
function menu_principal(){
echo '+==================================================================================================+'
echo '| INFOSERVICE COMPUTAÇÃO |'
echo '| MANIPULAÇÃO DE ARQUIVOS PDF - Versão: 1.2 - 21/09/23 |'
echo '| Requer: pdftk |'
echo '+==================================================================================================+'
echo '| MENU PRINCIPAL |'
echo '+==================================================================================================+'
echo ''
echo ' 1 - Fracionar um arquivo PDF em partes menores'
echo ''
echo ' 2 - Extrair páginas de um arquivo PDF'
echo ''
echo ' 3 - Juntar vários arquivos PDF em arquivo único'
echo ''
echo ' 4 - Rotacionar páginas de arquivo PDF'
echo ''
echo ' 5 - Sair'
echo ''
read -n 1 -p ' Digite a opção: ' opcao
}
#cria um efeito de abertura
for ((efeito=1; efeito<=100; efeito++))
do
clear
des_cabecalho
barra=$barra'#'
echo '+==================================================================================================+'
echo "Carregando o programa: $efeito %"
echo $barra
echo '+==================================================================================================+'
sleep 0.1
done
#espera um tempo
sleep 2
#inicia o looping do menu principal
while :
do
#limpa a tela
clear
#desenha o cabeçalho
des_cabecalho
#desenha o menu principal
menu_principal
#OPÇÃPO 1, seleciona o fracionamento de PDF
if [ $opcao = 1 ]
then
#cria as variáveis que serão utilizadas no script
#variável com o nome do arquivo a ser fracionado
nomepdf=''
#variável informando a quantidade de páginas do arquivo a ser fracionado
qtdpaginaspdf=0
#prefixo de saída das frações
prefixosaida=''
#variável que define o tamanho das frações em megabytes
tamanhosaida=0
#variável que serve para controlar o número do arquivo das frações geradas
contafracoes=0
#variável que armazena a lista de arquivos que fará parte de cada fração
lista=''
#variável que coloca zeros a frente do numero do arquivo corrente
zeros_esquerda=''
#variável que pega o tamanho do arquivo corrente dos que foram divididos do arquivo principal
tamanhoarquivo=0
#variável que soma a lista de arquivos até atingir o tamanho máximo da fração
somaarquivos=0
#variável que converte a soma dos arquivos em kilobates
somaarquivoskb=0
echo ''
echo '+==================================================================================================+'
echo '| DADOS DO ARQUIVO PDF A SER FRACIONADO |'
echo '| |'
echo '| Obs. Campos com (*) são de preenchimento obrigatório. |'
echo '+==================================================================================================+'
echo ''
#solicita a digitação do nome do arquivo de origem
read -p 'Nome do arquivo (*): ' nomepdf
#verifica se o nome do arquivo é válido
if [ ! -e $nomepdf ]
then
echo ''
echo 'Nome de arquivo inválido ou inexistente!'
sleep 3
elif [ -z $nomepdf ]
then
echo ''
echo 'Nome de arquivo inválido ou inexistente!'
sleep 3
else
echo ''
echo '+==================================================================================================+'
echo '| INFORMAÇÕES SOBRE O ARQUIVO SELECIONADO |'
echo '+==================================================================================================+'
pdfinfo $nomepdf
echo '+==================================================================================================+'
echo ''
read -p 'Fracionar até a página nº (*): ' qtdpaginaspdf
echo ''
read -p 'Prefixo do arquivo de saída: ' prefixosaida
echo ''
read -p 'Tamanho dos arquivos de saída em megabytes: ' tamanhosaida
echo ''
#caso o usuário não digitar o prefíxo define como Parte
prefixosaida=${prefixosaida:='Parte'}
#caso o usuário não digitar nenhum valor coloca o padrão de 7MB
tamanhosaida=${tamanhosaida:=7}
#converte de megabytes para kilobates
((tamanhosaida=$tamanhosaida*1024))
echo '+==================================================================================================+'
echo ''
echo 'Processando o arquivo PDF de origem, isso pode demorar um pouco...'
#separa o arquivo de origem em várias páginas
pdftk $nomepdf burst
echo ''
echo 'Fracionando o arquivo PDF de origem, isso pode demorar um pouco...'
#junta os grupos de páginas até o tamanho definido na variável de limite de saída
for ((contapaginas=1; contapaginas<=$qtdpaginaspdf; contapaginas++))
do
zeros_esquerda=$(printf "%04d" $contapaginas)
lista=$lista'pg_'$zeros_esquerda'.pdf '
#calcula o tamanho do arquivo corrente em bytes
tamanhoarquivo=$(stat -c %s 'pg_'$zeros_esquerda'.pdf')
#soma o tamanho do arquivo corrente ao tamanho parcial
((somaarquivos=$somaarquivos+$tamanhoarquivo))
#converte a soma em kilobates
((somaarquivoskb=$somaarquivos/1024))
#se o grupo de arquivos juntados for maior que o limite de saída, grava uma fração
if [ $somaarquivoskb -gt $tamanhosaida ]
then
#incrementa o número do arquivo de fração
((contafracoes+=1))
echo ''
echo 'Gravando a fração nº: '$contafracoes
pdftk $lista output $prefixosaida'_'$contafracoes'.pdf'
#reinicia a lista de arquivos lidos
lista='';
#reinicia a soma dos tamanhos dos arquivos
somaarquivos=0;
fi
done
#caso reste algum arquivo que sobrou do cálculo grava o mesmo em uma última fração menor
if [ $somaarquivos -gt 0 ]
then
#incrementa o número do arquivo de fração
((contafracoes+=1))
echo ''
echo 'Gravando a fração nº: '$contafracoes
pdftk $lista output $prefixosaida'_'$contafracoes'.pdf'
fi
echo ''
echo 'Limpando os arquivos temporários, isso pode demorar um pouco...'
#exclui os arquivos temporários criados
rm pg_*.pdf
rm doc_data.txt
echo ''
echo 'Fracionamento concluído com sucesso!'
#espera 5 segundos para retornar ao menu principal
sleep 3
fi
#fim do fracionamento
fi
#OPÇÃO 2, executa a extração de páginas do PDF
if [ $opcao = 2 ]
then
#variável que armazena o nome do arquivo pdf a ser fracionado
nomepdf=''
paginasextrair=''
nomesaida=''
echo ''
echo '+==================================================================================================+'
echo '| DADOS DO ARQUIVO PDF DE ORIGEM |'
echo '| |'
echo '| Obs. Campos com (*) são de preenchimento obrigatório. |'
echo '+==================================================================================================+'
echo ''
read -p 'Nome do arquivo (*): ' nomepdf
if [ ! -e $nomepdf ]
then
echo ''
echo 'Nome de arquivo inválido ou inexistente!'
sleep 3
elif [ -z $nomepdf ]
then
echo ''
echo 'Nome de arquivo inválido ou inexistente!'
sleep 3
else
echo ''
read -p 'Página(s) a extrair Ex: 1 2 3 4-20 (*): ' paginasextrair
echo ''
read -p 'Nome do arquivo de saída (*): ' nomesaida
echo ''
echo '+==================================================================================================+'
echo ''
echo 'Extraindo as páginas selecionadas, aguarde o processamento ...'
pdftk $nomepdf cat $paginasextrair output $nomesaida'.pdf'
echo ''
echo 'Páginas '$paginasextrair' extraídas com sucesso!'
sleep 3
fi
#fim da extração de páginas
fi
#OPÇÃO 3 - junta arquivos pdf em arquivo único
if [ $opcao = 3 ]
then
nomespdfs=''
nomesaida=''
echo ''
echo '+==================================================================================================+'
echo '| DADOS DOS ARQUIVOS PDF A SEREM JUNTADOS |'
echo '| |'
echo '| Obs. Campos com (*) são de preenchimento obrigatório. |'
echo '+==================================================================================================+'
echo ''
read -p 'Nomes dos arquivos separados por espaço (*): ' nomespdfs
if [ "$nomespdfs" = "" ]
then
echo ''
echo 'Necessário informar a lista de arquivos!'
sleep 3
else
echo ''
read -p 'Nome do arquivo de saída (*): ' nomesaida
echo ''
#junta os arquivos pdfs em um único arquivo
echo ''
echo 'Juntando os arquivos, aguarde o processamento ...'
pdftk $nomespdfs output $nomesaida'.pdf'
echo ''
echo 'Arquivos juntados com sucesso!'
sleep 3
fi
#fim da junção
fi
#OPÇÃO 4 - rotacionar páginas de arquivo pdf gerando um arquivo de resultado
if [ $opcao = 4 ]
then
nomepdf=''
nomesaida=''
intervalo_pr=''
intervalo_gi=''
intervalo_po=''
giro=''
cmdgiro=''
echo ''
echo '+==================================================================================================+'
echo '| DADOS DO ARQUIVO PDF QUE TERÁ PÁGINAS ROTACIONADAS |'
echo '| |'
echo '| Obs. Campos com (*) são de preenchimento obrigatório. |'
echo '+==================================================================================================+'
echo ''
read -p 'Nome do arquivo (*): ' nomepdf
if [ ! -e $nomepdf ]
then
echo ''
echo 'Nome de arquivo inválido ou inexistente!'
sleep 3
elif [ -z $nomepdf ]
then
echo ''
echo 'Nome de arquivo inválido ou inexistente!'
sleep 3
else
echo ''
echo '+==================================================================================================+'
echo '| INFORMAÇÕES SOBRE O ARQUIVO SELECIONADO |'
echo '+==================================================================================================+'
pdfinfo $nomepdf
echo '+==================================================================================================+'
echo ''
read -p 'Nome do arquivo de saída (*): ' nomesaida
echo ''
read -p 'Página(s) anterior(es) à(s) página(s) a ser(em) girada(s): ' intervalo_pr
echo ''
read -p 'Página(s) a ser(em) girada(s): ' intervalo_gi
echo ''
read -p 'Página(s) posterior(es) à(s) página(s) a ser(em) girada(s): ' intervalo_po
echo ''
read -p 'Rotacionar para posição 0, 90, 180 ou 270 graus: ' giro
echo ''
if [ $giro = 0 ]
then
cmdgiro='north'
fi
if [ $giro = 90 ]
then
cmdgiro='east'
fi
if [ $giro = 180 ]
then
cmdgiro='south'
fi
if [ $giro = 270 ]
then
cmdgiro='west'
fi
#rotaciona as páginas selecionadas
echo ''
echo 'Rotacionando a(s) página(s) indicada(s), aguarde o processamento ...'
#comando de girar páginas
pdftk $nomepdf cat $intervalo_pr $intervalo_gi$cmdgiro $intervalo_po output $nomesaida'.pdf'
echo ''
echo 'Páginas rotacionadas com sucesso!'
sleep 3
fi
#fim da rotação
fi
#se escolher a última opção, sai do programa
if [ $opcao = 5 ]
then
echo ''
echo ''
echo ' --------------------------------'
read -p ' Deseja sair do programa (Sim/Não)? ' -n 1 sair
if [ $sair = 's' -o $sair = 'S' ]
then
clear
exit
fi
fi
done
#Fim do script
Shell para extrair informações de impressoras Brother
Gunzipar arquivos com determinadas extensões
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
[Resolvido] VirtualBox can't enable the AMD-V extension
Como verificar a saúde dos discos no Linux
Como instalar , particionar, formatar e montar um HD adicional no Linux?
Como automatizar sua instalação do Ubuntu para desenvolvimento de software.
Não consigo instalar distro antiga no virtualbox nem direto no hd (14)
Quais os códigos mais dificeis que vcs sabem fazer? (12)
systemd-resol... precisa ser reiniciado periodicamente [RESOLVIDO] (7)









