Manipulando Arquivos PDF Pelo Terminal Usando O pdftk

Introdução

O programa pdftk (PDF Toolkit) é uma ferramenta de linha de comando usada para manipular arquivos PDF’s. Ele pode ser usado para combinar vários arquivos PDF’s em um só, extrair páginas, criptografar documentos e muito mais.

O pdftk pode ser facilmente integrado em shell scripts devido sua interface de linha de comando. Além do mais, os conceitos vistos aqui poderão ser usados em outras plataformas já que esse programa atualmente roda em Linux, Windows, Mac, FreeBSD, etc.

Nesse post iremos ver alguns usos básicos do pdftk para tarefas rotineiras em arquivos PDF’s.

Instalação

Em:

http://www.pdflabs.com/docs/install-pdftk/

você encontra um guia de instalação desse software. A instalação pode ser tanto pelo fonte quanto pelos binários. No Fedora, basta executar:

$ sudo yum install pdftk

para instalar o programa. No Ubuntu, você pode utilizar o apt-get:

$ sudo apt-get install pdftk

Sintaxe básica

$ pdftk <arquivos PDFs de entrada> <operação> <parâmetros da operação> <comando> <parâmetros do comando>

Pela man-page, vemos que:

Comandos:
[ output < output filename | - | PROMPT > ]
[ encrypt_40bit | encrypt_128bit ]
[ allow < permissions > ]
[ owner_pw < owner password | PROMPT > ]
[ user_pw < user password | PROMPT > ]
[ flatten ]
[ compress | uncompress ]
[ keep_first_id | keep_final_id ]
[ drop_xfa ]
[ verbose ]
[ dont_ask | do_ask ]

Operações:
[ cat | shuffle | burst | 
generate_fdf | fill_form | 
background | multibackground | 
stamp | multistamp | 
dump_data | dump_data_utf8 | 
dump_data_fields | dump_data_fields_utf8 | 
update_info | update_info_utf8 | 
attach_files | unpack_files ]

Extraindo páginas de um arquivo

Imagine que você deseja imprimir as páginas 20-30, 50-65, 90-101, 115-122 e a página 200 de um PDF qualquer. Imagine também você imprimindo essas páginas em um outro local, tipo uma banca de xerox. É bem provável que o atendente se atrapalhe nas numerações de páginas e a chance de faltar páginas é muito grande. Para evitar esse tipo de problema, antes da impressão, podemos extrair somente essas páginas do PDF original e salvá-las em outro PDF. Desse modo temos somente um arquivo a ser impresso, sem precisar de recorrer a marcação de páginas individuais.

Para extrair páginas usamos a operação cat com o número das páginas como parâmetro e o comando output para gravar num arquivo de saída. O comando fica:

$ pdftk arquivoentrada.pdf cat 20-30 50-65 90-101 115-122 200 output arquivosaida.pdf

Sendo arquivoentrada.pdf o pdf de leitura e arquivosaida.pdf o arquivo gerado.

Extraindo páginas de vários arquivos

Como vários arquivos estão sendo tratados, então se tentarmos extrair as páginas 10-20 o pdftk ficaria em dúvida de qual arquivo obter essas páginas. Nesse caso o pdftk fornece o que ele chama de handler que nada mais é que um identificador para cada arquivo da entrada. Os handlers são usados pelo pdftk para evitar ambiguidade nas operações. Veja:

$ pdftk A=arquivo1.pdf B=arquivo2.pdf cat A1-5 B10-20 output arquivosaida.pdf

Criamos dois handlers, A e B, que foram associados aos arquivos de entrada. Em seguida extraímos as páginas 1-5 do arquivo1.pdf e as páginas 10-20 do arquivo2.pdf usando os handlers de cada arquivo.

Remoção de páginas

Para remover uma página, basta escolhermos com o cat aquelas que queremos. Então, para remover a página 10 de um arquivo, fazemos:

$ pdftk arquivoentrada.pdf cat 1-9 11-end output arquivosaida.pdf

A palavra end é um apelido para a última página.

Trocando páginas

Na linha abaixo colocamos a página 3 como primeira página e a página 1 como terceira:

$ pdftk arquivoentrada.pdf cat 3 2 1 4-end output arquivosaida.pdf

União de arquivos

O cat sem parâmetros indica que todas as páginas devem ser lidas, então para unir vários arquivos em um só fazemos:

$ pdftk arquivo1.pdf arquivo2.pdf arquivo3.pdf arquivo4.pdf cat output arquivosaida.pdf

Palavras chaves

No caso da especificação de páginas podemos utilizar palavras chaves, que nada mais são que identificadores como end para indicar a última página e even para indicar páginas pares. Veja:

$ pdftk arquivoentrada.pdf cat even output arquivosaida.pdf

Grava em arquivosaida.pdf todas as páginas pares de arquivoentrada.pdf.

Agora as páginas ímpares:

$ pdftk arquivoentrada.pdf cat odd output arquivosaida.pdf

A linha abaixo grava da décima página até a última:

$ pdftk arquivoentrada.pdf cat 10-end output arquivosaida.pdf

Se você deseja extrair páginas ímpares/pares de um determinado intervalo então você deve “colar” a palavra chave no intervalo, como feito na linha abaixo.

$ pdftk arquivoentrada.pdf cat 1-10even output arquivosaida.pdf

arquivosaida.pdf terá as páginas 2, 4, 6, 8, 10 de arquivoentrada.pdf.

Uma observação é que a intervalo pode ser negativo, isso é, o intervalo 6-1even irá extrair as páginas 6, 4, 2, nessa ordem.

“Explodindo” páginas

O comando burst (= explodir) separa as páginas de um único arquivo de entrada em vários arquivos PDF’s, isso é, cada página do arquivo de entrada será um novo arquivo PDF.

Suponha que arquivoentrada.pdf tenha 25 páginas, então:

$ pdftk arquivoentrada.pdf burst
$ ls -la pg*
-rw-rw-r--. 1 daemonio daemonio 330625 Apr 14 01:16 pg_0001.pdf
-rw-rw-r--. 1 daemonio daemonio 330305 Apr 14 01:16 pg_0002.pdf
-rw-rw-r--. 1 daemonio daemonio 330612 Apr 14 01:16 pg_0003.pdf
-rw-rw-r--. 1 daemonio daemonio 329535 Apr 14 01:16 pg_0004.pdf
-rw-rw-r--. 1 daemonio daemonio 329748 Apr 14 01:16 pg_0005.pdf
-rw-rw-r--. 1 daemonio daemonio 329744 Apr 14 01:16 pg_0006.pdf
-rw-rw-r--. 1 daemonio daemonio 328593 Apr 14 01:16 pg_0007.pdf
-rw-rw-r--. 1 daemonio daemonio 328749 Apr 14 01:16 pg_0008.pdf
-rw-rw-r--. 1 daemonio daemonio 328309 Apr 14 01:16 pg_0009.pdf
-rw-rw-r--. 1 daemonio daemonio 329161 Apr 14 01:16 pg_0010.pdf
-rw-rw-r--. 1 daemonio daemonio 329640 Apr 14 01:16 pg_0011.pdf
-rw-rw-r--. 1 daemonio daemonio 328784 Apr 14 01:16 pg_0012.pdf
-rw-rw-r--. 1 daemonio daemonio 327916 Apr 14 01:16 pg_0013.pdf
-rw-rw-r--. 1 daemonio daemonio 328471 Apr 14 01:16 pg_0014.pdf
-rw-rw-r--. 1 daemonio daemonio 328070 Apr 14 01:16 pg_0015.pdf
-rw-rw-r--. 1 daemonio daemonio 328752 Apr 14 01:16 pg_0016.pdf
-rw-rw-r--. 1 daemonio daemonio 328272 Apr 14 01:16 pg_0017.pdf
-rw-rw-r--. 1 daemonio daemonio 329340 Apr 14 01:16 pg_0018.pdf
-rw-rw-r--. 1 daemonio daemonio 328542 Apr 14 01:16 pg_0019.pdf
-rw-rw-r--. 1 daemonio daemonio 329628 Apr 14 01:16 pg_0020.pdf
-rw-rw-r--. 1 daemonio daemonio 328025 Apr 14 01:16 pg_0021.pdf
-rw-rw-r--. 1 daemonio daemonio 329714 Apr 14 01:16 pg_0022.pdf
-rw-rw-r--. 1 daemonio daemonio 329466 Apr 14 01:16 pg_0023.pdf
-rw-rw-r--. 1 daemonio daemonio 327779 Apr 14 01:16 pg_0024.pdf
-rw-rw-r--. 1 daemonio daemonio 327552 Apr 14 01:16 pg_0025.pdf

vinte e cinco arquivos foram criados sendo que cada um corresponde a uma página do arquivo de entrada. O nome do arquivo gerado é uma string de formato no estilo printf e a padrão é pg_%04d.pdf. Para modificar o nome do arquivo, usamos a nova string de formato após o comando output, assim:

$ pdftk arquivoentrada burst output pagina_numero_%04d.pdf

Rotação de páginas

A operação cat aceita mais um parâmetro no intervalo que indica um ângulo de rotação. Os ângulos já estão tabelados pelo pdftk, e abaixo listo essa tabela:

+-------+--------+
|Letra  | Angulo |
+-------+--------+
|  N    |    0   |
+-------+--------+
|  E    |   90   |
+-------+--------+
|  S    |   180  |
+-------+--------+
|  W    |   270  |
+-------+--------+
|  L    |   -90  |
+-------+--------+
|  R    |   +90  |
+-------+--------+
|  D    |  +180  |
+-------+--------+

Sabendo disso, para rotacionar somente a primeira página em 90 graus no sentido do relógio, fazemos:

$ pdftk arquivoentrada.pdf cat 1E 2-end output arquivosaida.pdf

Se por algum motivo as páginas de 10-20 estão de cabeça pra baixo então usamos o comando abaixo para estruturá-las corretamente:

$ pdftk arquivoentrada.pdf cat 1-9 10-20S 21-end output arquivosaida.pdf

Mais exemplos

O objetivo desse post foi mostrar o básico sobre o pdftk para resolução de tarefas rotineiras. Entretanto, para saber mais do poder dessa ferramenta, consulte a sua man page [4] e também um conjunto de exemplos de utilização na referência [1].

Referências

[1] Pdftk Examples (Acessado em: Abril/2012)
http://www.pdflabs.com/docs/pdftk-cli-examples/

[2] REARRANGE PDF PAGES WITH PDFTK, by chewearn (Acessado em: Abril/2012)
http://blog.chewearn.com/2008/12/18/rearrange-pdf-pages-with-pdftk/

[3] Manipulando arquivos PDF com pdftk, by stefanols (Acessado em: Abril/2012)
http://www.vivaolinux.com.br/dica/Manipulando-arquivos-PDF-com-pdftk

[4] Pdftk Man Page (Acessado em: Abril/2012)
http://www.pdflabs.com/docs/pdftk-man-page/

[5] Interleaving two PDF files… by Chris (Acessado em: Abril/2012)
http://binarystatic.wordpress.com/2010/10/17/interleaving-two-pdf-files/

[6] Split and Merge PDF Documents (Even Without Acrobat) (Acessado em: Abril/2012)
http://oreilly.com/pub/h/2394

3 pensamentos sobre “Manipulando Arquivos PDF Pelo Terminal Usando O pdftk

  1. Pingback: pdftk & Impressão Frente E Verso | Daemonio Labs

Deixe um comentário