ARSPDF - Programa para manipular arquivos PDF
Publicado por Alexandre Rodrigues dos Santos (última atualização em 11/11/2023)
[ Hits: 3.262 ]
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
Script de Backup de DVD com growisofs
extract.sh: Script baseado no extract da phrack
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
ERRO: LAZARUS 4.2 64 no Linux MINT não entra mais apos ajustar desktop... (0)
Pergunta: Meu teclado não está respondendo direito como e consertar? (2)
Secure boot, artigo interessante, nada técnico. (6)
SQLITE não quer funcionar no LINUX LMDE6 64 com Lazaruz 4.2 64bit (n... (0)









