quinta-feira, janeiro 24, 2013

Arquivos PDF no Linux: juntando, quebrando e brincando

Pessoal, bom dia!

Vamos direto ao ponto. Minha necessidade era juntar 2 arquivos PDF. A solução foi utilizar o PDFTK, em linha de comando mesmo.
Fuçando na internet, achei uma postagem do Helbert Rocha em http://meupinguim.com/como-juntar-pdf-linux/ que atendeu à minha necessidade e depois também encontrei uma outra postagem do Ricardo Costa em http://www.linuxdescomplicado.com.br/2011/11/maneira-mais-facil-para-unir-e-dividir.html que dava referência ao site do desenvolvedor.

PDFLabs - http://www.pdflabs.com/docs/pdftk-cli-examples/

Instalando:

Abrindo o console você deve instalar (se não já tiver instalado, claro) o PDFTK. Esta ação deveser feita como super-usuário, então:
$ sudo apt-get install pdftk

Com ele instalado você pode obter as informações de comandos e parâmetros utilizando:
$ info pdftk

A partir de agora, mão à obra!

Quando eu trabalho com arquivos com necessidade simples, prefiro tê-los na mesma pasta e trabalhar com eles gerando o produto do trabalho no mesmo diretório. Mas isso é de cada um. Então, por exemplo, considerando que quando abrimos uma console estamos em nosso "home" e que os arquivos estejam no Desktop:
$ cd Desktop

Agora os usos mais interessantes (para mim)!

Juntando arquivos:

Vamos juntar 3 arquivos - a1.pdf, a2.pdf e a3.pdf - em junto.pdf
$ pdftk a1.pdf a2.pdf a3.pdf cat output junto.pdf

Podemos também dar apelidos para um uso mais avançado, e unir somente alguns deles da lista:
$ pdftk A=a1.pdf B=a2.pdf C=a3.pdf cat A C output parcial.pdf

Se quiser juntar tudo de um diretório:
$ pdftk *.pdf cat output tudo.pdf

Colando 2 arquivos, sendo uma página de cada por vez (escaneou dessa forma, por exemplo):
$ pdftk A=impar.pdf B=par.pdf shuffle A B output ordenado.pdf

Separando:

Vamos separar junto.pdf em páginas individuais:
$ pdftk junto.pdf burst

Removendo:

Vamos remover a página 5 e gerar o arquivos faltando.pdf (a saída será de 1 a 4 e de 6 até o fim):
$ pdftk completo.pdf cat 1-4 6-end output faltando.pdf
ou
$ pdftk A=completo.pdf cat A1-4 A6-end output faltando.pdf

Brincando um pouco:

Juntando 2 arquivos, o primeiro inteiro e o segundo somente as 3 primeiras páginas.
$ pdftk A=a1.pdf B=a2.pdf cat A B1-3 output juntofaltando.pdf

Girando a 90 graus em sentido horário (leste/direita) a primeira página do arquivo e o restante deixando como veio:
$ pdftk entrada.pdf cat 1east 2-end output saida.pdf

Segurança:

Criptografando um arquivo (128-bit por padrão) com senha "minhasenha":
$ pdftk entrada.pdf output saida128.pdf owner_pw minhasenha

E com criptografia 40-bit (revoga todos os acessos por padrão):
$ pdftk a1.pdf a2.pdf cat output saida40.pdf encrypt_40bit owner_pw minhasenha

Juntando 2 arquivos sendo o primeiro com senha e gerando um sem criptografia:
$ pdftk A=comsenha.pdf semsenha.pdf input_pw A=senhadoarquivo cat output saida.pdf


Espero ter ajudado! Dê uma olhada na info do pdftk e no site do desenvolvedor que passei no início da postagem.

Abraço!

5 comentários:

Anônimo disse...

Suas informações foram muito úteis! Obrigado.

Agora tenho uma dúvida, ao gerar um arquivo com senha 128-bit, ao abrir o arquivo gerado este NÃO pede senha? O que seria essa senha? Obrigado.

Aquiles Maior disse...

Olá boa tarde, gostei muito de seu artigo, explica tudo direitinho parabéns. Porém me surgiu uma dúvida na qual eu tentei de várias formas e não consegui. Como usar variaveis dentro do exec(). Por exemplo: "um exemplo simples"

/* Assim eu Consigo Gerar meu Unico arquivo mesclado */

//echo exec("pdftk dir/file1.pdf dir/file2.pdf cat output dir/full.pdf");

$a1 = "dir/file1.pdf";
$a2 = "dir/file2.pdf";
$full = "dir/full.pdf";

/* Neste exemplo abaixo eu não consigo, e preciso criar desta forma que está abaixo, pois os valores dessas variáveis muda
é de acordo com o que eu puxo no banco, neste exemplo simplifiquei só pra ficar fácil de entender. Se eu conseguir fazer funcionar
na ideia com variaveis aí dentro aí eu já consigo chegar na solução aqui*/

echo exec("pdftk $a1 $a2 cat output $full");

Será possível isso?. Obrigado!!!! E novamente parabéns Daniel pelo post.

Daniel disse...

Aquiles,

A declaração de variável no shell é sem o "$". O "$" vem antes da variável quando a usamos. Teste algo assim:

e1="entrada1.pdf"
e2="entrada2.pdf"
s1="saida.pdf"
pdftk $e1 $e2 cat output $s1

Anônimo disse...

Olá,
Esse programa consegue separar um arquivo pdf com 500 páginas, porem quebrando de duas em duas página e não de uma em uma?
Gerando portanto 250 pdfs separados?
Se sim, como faria isso?
Obrigado

Daniel disse...

Acredito que somente fazendo um script que rode o pdftk com burst e depois junte de 2 em 2... algo como:

pdftk input.pdf burst output prefixo_%04d.pdf

Aqui quebramos o pdf em páginas individuais e os arquivos serão nomeados como "prefixo"+ pagina com 4 posições numéricas (prefixo0001.pdf, prefixo0002.pdf etc).

arq1=""
arq2=""
saida=""
cont=0
for entrada in `ls | grep '^prefixo'`; do
if [ $arq1="" ]; then
arq1=$entrada
elif [ $arq2="" ]; then
arq2=$entrada
cont=`expr $cont + 1`
pdftk $arq1 $arq2 cat "saida"$cont".pdf"
arq1=""
arq2=""
fi
done

Aqui lemos todos os arquivos que comecem com "prefixo" e ao preenchermos as duas variáveis (termos o nome de 2 arquivos) chamamos o pdftk para juntá-los dando uma numeracao para cada saída composta.

Faça uns testes para ver se lhe atende!

Abç!