Autor Tópico: PROCURO UM EDITOR DE PDF QUE AO UNIR ARQ CRIE UMA IDENTIFICAÇÃO DO ARQ NA PAGINA  (Lida 8012 vezes)

Offline jaime_bs

  • Usuário Ubuntu
  • *
  • Mensagens: 0
    • Ver perfil
Olá pessoal!
Estou procurando um editor de PDF para Ubuntu que ao unir arquivos gere uma identificação do nome do arquivo na respectiva página.
Exemplo: tenho os arquivos 001 - [nome_1], 002 - [nome_2], 003 - [nome_3], ..., nnn - [nome_n]. Ao unir estes arquivos preciso que seja impressa os nomes dos arquivos em cada página respectiva ao arquivo.
Se alguém já conhece essa solução, ficarei grato, pq são muitos arquivos.

Offline agente100gelo

  • Administrador
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.369
  • @Ceará
    • Ver perfil
Olá, primeiro: modifique o título da sua mensagem. Não são permitida mensagens em caixa alta. Veja as regras, por favor.

Em relação à sua necessidade, eu não conheço nenhum programa ou site que faça exatamente isso. Sei que dá pra desenvolver um script que possa fazer isso. Já fiz algo parecido mesmo em PHP há muito tempo atrás. Talvez em shell script seja mais simples.
Advogado e analista de sistema cearense.
Twitter: @glaydson

Offline Sampayu

  • Usuário Ubuntu
  • *
  • Mensagens: 510
  • "Não é possível semear de mãos fechadas"
    • Ver perfil
    • YouTube
Exemplo (limitado) usando o shell.
« Resposta #2 Online: 25 de MAR?O de 2022, 03:03 »
Olá pessoal!
Estou procurando um editor de PDF para Ubuntu que ao unir arquivos gere uma identificação do nome do arquivo na respectiva página.
Exemplo: tenho os arquivos 001 - [nome_1], 002 - [nome_2], 003 - [nome_3], ..., nnn - [nome_n]. Ao unir estes arquivos preciso que seja impressa os nomes dos arquivos em cada página respectiva ao arquivo.
Se alguém já conhece essa solução, ficarei grato, pq são muitos arquivos.

Não existe um modo fácil de se fazer isso: mesmo que você encontre um editor avançado de PDF, ele provavelmente será pago e não fará tudo que você quer. Pelo menos não de uma vez. Caso essa solução exista, terá de ser um editor que possui uma função BATCH (isso se refere a processamento em lote, ou seja, executar os mesmos comandos várias vezes, repetidamente, em vários arquivos, de maneira programada).

Se os seus arquivos não estiverem todos em formato PDF, é necessário convertê-los todos para .pdf, porque assim fica mais fácil manipulá-los em linha de comando (shell). Supondo que todos os seus arquivos estejam em formato PDF, um modo bastante limitado de fazer o que você está querendo é o dos passos a seguir. Mas antes instale estes programas, caso ainda não os tenha instalados:

- LibreOffice (instale-e com o comando sudo apt install libreoffice -y)
- pdftk-java (instale-o com o comando sudo apt install pdftk-java -y e, caso necessite do Java, instale-o conforme explicado aqui)
- Ghostscript (instale-o com o comando sudo apt install ghostscript -y)

PASSO A PASSO (não é uma solução mágica: é só um "quebra-galho"):

1. Copie todos os arquivos .pdf para uma pasta nova. Exemplo: acesse a pasta /tmp e então crie uma pasta chamada compilado (caminho completo: /tmp/compilado), daí copie todos os arquivos .pdf para /tmp/compilado. O ideal é copiar os arquivos .pdf, ao invés de os mover, porque se algo der errado ou não sair como você gostaria, os arquivos .pdf originais estarão a salvo na pasta original deles.

2. Em seguida, abra uma janela do terminal do shell e execute o comando cd /tmp/compilado para acessar a pasta que está com as cópias dos seus arquivos .pdf.

3. Agora na janela do terminal do shell, execute o comando abaixo para que o shell então procure e liste todos os arquivos .pdf dentro de /tmp/compilado cujos nomes têm uma ou mais (até 9) ocorrências do caractere " " (espaço em branco), e então renomeie esses arquivos de modo que cada um dos espaços em branco seja substituído por um caractere "_" (sublinhado/underscore):

Código: [Selecionar]
for i in 1 2 3 ; do for i in 1 2 3 4 5 6 7 8 9 ; do find . -name '*.pdf' -print0 | xargs -0 -n1 bash -c 'mv "$0" "${0/\ .pdf/\_.pdf}"' ; done ; for i in 1 2 3 4 5 6 7 8 9 ; do find . -name '*.pdf' -print0 | xargs -0 -n1 bash -c 'mv "$0" "${0/\ /\_}"' ; done ; done
4. Em seguida, execute o comando abaixo para eliminar as (até 9) repetições do caractere "_" nos nomes dos arquivos .pdf:

Código: [Selecionar]
for i in 1 2 3 ; do for i in 1 2 3 4 5 6 7 8 9 ; do find . -name '*.pdf' -print0 | xargs -0 -n1 bash -c 'mv "$0" "${0/\__/\_}"' ; done ; done
Se os arquivos .pdf originalmente não tinham nenhum nome exótico, agora todos estarão com nomes simples, tais como:

ANTES => DEPOIS
meudocumento.pdf => meudocumento.pdf
arquivo longo.pdf => arquivo_longo.pdf
arquivo   muito     longo.pdf => arquivo_muito_longo.pdf

5. O próximo passo é executar o comando abaixo, que para cada arquivo .pdf do diretório criará um arquivo .c.txt (esse c é de cabeçalho) com o mesmo nome do arquivo .pdf exceto que o interior desse arquivo .c.txt conterá somente o próprio nome do arquivo sem a extensão:

Código: [Selecionar]
for i in $(ls -A1 *.pdf |sed 's/\.[^.]*$//' |sed 's/\ /\_/') ; do echo $i > $i.c.txt ; done
Exemplos fictícios do resultado do comando acima:

- Para um arquivo meudocumento.pdf será criado um arquivo meudocumento.c.txt contendo dentro dele somente a palavra meudocumento.

- Para um arquivo arquivo_longo.pdf será criado um arquivo arquivo_longo.c.txt contendo dentro dele somente o texto arquivo_longo.

- Para um arquivo arquivo_muito_longo.pdf será criado um arquivo arquivo_muito_longo.c.txt contendo dentro dele somente o texto arquivo_muito_longo.

6. Agora execute o comando abaixo. Ele acessará o interior (conteúdo) de cada um dos arquivos .c.txt que agora constam no diretório e então substituirá cada umas das (até 9) ocorrências do caractere "_" pelo caractere " ":

Código: [Selecionar]
for i in 1 2 3 ; do for i in 1 2 3 4 5 6 7 8 9 ; do for i in $(ls -A1 *.c.txt) ; do sed -i 's/\_/\ /' $i ; done ; done ; done
7. O próximo passo é, para cada arquivo .c.txt, criar uma respectiva versão com extensão .pdf. O comando é este:

Código: [Selecionar]
for i in $(ls -A1 *.c.txt) ; do libreoffice --convert-to "pdf" $i ; done
8. Agora que os arquivos de cabeçalho também estão em formato PDF (com a extensão .c.pdf), basta usar o programa pdftk em loop para que ele aplique cada arquivo de cabeçalho .c.pdf como cabeçalho do respectivo arquivo .pdf:

Código: [Selecionar]
for i in $(ls -A1 *.c.pdf |sed 's/\.c.pdf//') ; do pdftk $i.pdf stamp $i.c.pdf output $i.p.pdf ; done
9. Os novos arquivos com o cabeçalho embutido terão todos o nome terminando com a extensão .p.pdf, então para uni-los basta executar no shell o programa Ghostscript instruído para combinar somente os arquivos que terminam com .p.pdf:

Código: [Selecionar]
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=compilado.pdf $(ls -A1 *.p.pdf)
10. O arquivo compilado.pdf será criado dentro de /tmp/compilado contendo todos os arquivos .p.pdf, sendo que toda página de cada arquivo .p.pdf terá no canto superior esquerdo o nome original do respectivo arquivo .pdf de origem.
« Última modificação: 25 de MAR?O de 2022, 15:55 por Sampayu »
Yuri Sucupira ("Sampayu")

Offline agente100gelo

  • Administrador
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.369
  • @Ceará
    • Ver perfil
Passados os dias sem alteração do título. Fecho o tópico.
Advogado e analista de sistema cearense.
Twitter: @glaydson