Dividir um único arquivo PDF grande em n arquivos PDF com base no conteúdo e renomear cada arquivo dividido (no Bash)

0

Estou trabalhando em um método de divisão de um único arquivo PDF grande (que representa as liquidações mensais de um cartão de crédito). Ele é construído para impressão, mas gostaríamos de dividir esse arquivo em arquivos únicos, para uso posterior. Cada assentamento tem um comprimento variável: 2 páginas, 3 páginas, 4 páginas ... Então, precisamos "ler" cada página, encontrar a "Página 1 de X" e dividir o pedaço até a próxima página de X " aparece. Além disso, cada arquivo dividido resultante deve ter um ID único (contido também na página "Página 1 de X").

Enquanto eu estava R & D -ing, encontrei uma ferramenta chamada "PDF Content Split SA" que fazia a tarefa exata que precisávamos. Mas tenho certeza que há uma maneira de fazer isso no Linux (estamos nos movendo em direção ao OpenSource + Libre).

Obrigado pela leitura. Qualquer ajuda será extremamente útil.

EDITAR

Até agora, encontrei este script do Nautilus que pode fazer exatamente o que precisamos, mas não consigo fazê-lo funcionar.

#!/bin/bash
# NAUTILUS SCRIPT
# automatically splits pdf file to multiple pages based on search criteria while renaming the output files using the search criteria and some of the pdf text.

# read files
IFS=$'\n' read -d '' -r -a filelist < <(printf '%s\n' "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"); unset $IFS

# process files
for file in "${filelist[@]}"; do
 pagecount='pdfinfo $file | grep "Pages" | awk '{ print $2 }''
 # MY SEARCH CRITERIA is a 10 digit long ID number that begins with number 8: 
 storedid='pdftotext -f 1 -l 1 $file - | egrep '8?[0-9]{9}''
 pattern=''
 pagetitle=''
 datestamp=''

 for (( pageindex=1; pageindex<=$pagecount; pageindex+=1 )); do

  header='pdftotext -f $pageindex -l $pageindex $file - | head -n 1'
  pageid='pdftotext -f $pageindex -l $pageindex $file - | egrep '8?[0-9]{9}''
  let "datestamp ='date +%s%N'" # to avoid overwriting with same new name

  # match ID found on the page to the stored ID
  if [[ $pageid == $storedid ]]; then
   pattern+="$pageindex " # adds number as text to variable separated by spaces
   pagetitle+="$header+"

   if [[ $pageindex == $pagecount ]]; then #process last output of the file 
    pdftk $file cat $pattern output "$storedid $pagetitle $datestamp.pdf"
    storedid=0
    pattern=''
    pagetitle=''
   fi
  else 
   #process previous set of pages to output
   pdftk $file cat $pattern output "$storedid $pagetitle $datestamp.pdf"
   storedid=$pageid
   pattern="$pageindex "
   pagetitle="$header+"
  fi
 done
done

Eu editei os Critérios de Pesquisa, e o Script está bem posicionado na pasta do Nautilus Script, mas não funciona. Eu tentei depurar usando o log de atividades do console e adicionando marcas no código; aparentemente, há um conflito com o valor resultante do pdfinfo, mas não tenho ideia de como resolvê-lo.

    
por RBaravalle 06.06.2018 / 15:55

2 respostas

0

Eu fiz isso. Pelo menos, funcionou. Mas agora eu gostaria de otimizar o processo. Leva até 40 minutos para processar 1000 itens em um único pdf em massa.

#!/bin/bash
# NAUTILUS SCRIPT
# automatically splits pdf file to multiple pages based on search criteria while renaming the output files using the search criteria and some of the pdf text.



# read files
IFS=$'\n' read -d '' -r -a filelist < <(printf '%s\n' "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"); unset $IFS



# process files
for file in "${filelist[@]}"; do
 pagecount=$(pdfinfo $file | grep "Pages" | awk '{ print $2 }')
 # MY SEARCH CRITERIA is a 10 digit long ID number that begins with number 8: 
#storedid='pdftotext -f 1 -l 1 $file - | egrep '8?[0-9]{9}''
 storedid=$(pdftotext -f 1 -l 1 $file - | egrep 'RESUMEN DE CUENTA Nº ?[0-9]{8}')
 pattern=''
 pagetitle=''
 datestamp=''

 #for (( pageindex=1; pageindex <= $pagecount; pageindex+=1 )); do
 for (( pageindex=1; pageindex <= $pagecount+1; pageindex+=1 )); do

  header=$(pdftotext -f $pageindex -l $pageindex $file - | head -n 1)


  pageid=$(pdftotext -f $pageindex -l $pageindex $file - | egrep 'RESUMEN DE CUENTA Nº ?[0-9]{8}')


  echo $pageid
  let "datestamp = $(date +%s%N)" # to avoid overwriting with same new name

  # match ID found on the page to the stored ID
  if [[ $pageid == $storedid ]]; then
   pattern+="$pageindex " # adds number as text to variable separated by spaces
   pagetitle+="$header+"


   if [[ $pageindex == $pagecount ]]; then #process last output of the file 
#   pdftk $file cat $pattern output "$storedid $pagetitle $datestamp.pdf"
    pdftk $file cat $pattern output "$storedid.pdf"
    storedid=0
    pattern=''
    pagetitle=''

   fi
  else 
   #process previous set of pages to output
#  pdftk $file cat $pattern output "$storedid $pagetitle $datestamp.pdf"
   pdftk $file cat $pattern output "$storedid.pdf"
   storedid=$pageid
   pattern="$pageindex "
   pagetitle="$header+"

  fi
 done
done
    
por 07.06.2018 / 20:11
1

Algum python rápido é uma opção? O pacote PyPDF2 permite que você faça exatamente o que você está pedindo.

    
por 06.06.2018 / 16:25