ARSPDF - Programa para manipular arquivos PDF

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

[ Hits: 2.313 ]

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

Menu_Funcional dialog

Compartilhamento NAT

tagtool

Contador (progresso) em shell

Teste de conexão


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts