ARSPDF - Programa para manipular arquivos PDF

Publicado por Alexandre Rodrigues dos Santos (última atualização em 11/11/2023)

[ Hits: 2.931 ]

Download arspdf.sh




Manipulação de arquivos PDF, utilizando o utilitário pdftk.
É possível dividir, juntar, extrair e rotacionar páginas em um arquivo PDF.

  



Esconder código-fonte

#!/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

Scripts recomendados

Inventário de Hardware 3.1

ebook-cli - gerencia livros digitais entre PC e leitores ebooks

Calcular o consumo de energia elétrica de eletrodomésticos

Testar várias portas TCP para um único host/IP

Extração do áudio de um DVD - Ogg Vorbis


  

Comentários
[1] Comentário enviado por maurixnovatrento em 24/01/2024 - 21:08h

show.
______________________________________________________________________
Inscreva-se no meu Canal: https://www.youtube.com/@LinuxDicasPro
Repositório GitHub do Canal: https://github.com/LinuxDicasPro
Grupo do Telegram: https://t.me/LinuxDicasPro
Meu GitHub Pessoal: https://github.com/mxnt10


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts