Motivação

Existem atualmente muito mais dados na forma de textos eletrônicos do que em tempos passados, porém grande parte desses dados não são aproveitados e dificilmente uma análise mais detalhada sobre o seu conteúdo é realizada. Muitos desses textos podem ser encontrados em fóruns, redes sociais, sites de avaliação de produtos, documentos PDF, entre outros. Dentro desse contexto, é muito difícil uma pessoa ser capaz de ler, entender e sintetizar megabytes de texto, o que, em contrapartida, gerou novas pesquisas no sentido de desenvolver técnicas para exploração e administração da informação. Como consequência, surgiram ferramentas para extrair dados desse tipo de documento, como o PDFBox.

O conhecimento sobre ferramentas para recuperação de informação em documentos de texto, tal como o PDFBox, é de suma importância para desenvolvedores que precisam manipular arquivos no formato PDF e utilizar o seu conteúdo para algum tipo de processamento específico, como indexação ou busca por informações. O PDFBox possibilita a extração de conteúdo por páginas ou parágrafos, além de criar novos documentos, manipular imagens, converter PDF em imagens, adicionar novo conteúdo a documentos existentes ou até mesmo extrair dados por meio de expressões regulares.

Passo 1: Inserção de conteúdo em documentos PDF

O primeiro exemplo que será desenvolvido com o PDFBox consiste em inserir alguma informação em um PDF já existente. Na Figura 1 podemos visualizar o documento a ser utilizado. O leitor pode optar por qualquer documento para realizar essa operação.


Figura 1. PDF utilizado no exemplo

Sabendo disso, o próximo passo é criar um novo projeto Java e uma nova classe, chamada InsercaoConteudoPDF, em uma IDE; neste artigo, optamos pelo NetBeans. Nessa IDE, para a criação do projeto deve ser acessada a seguinte opção do menu: Arquivo > Novo Projeto > Aplicação Java. Feito isso, podemos criar uma classe por meio do menu Arquivo > Novo Arquivo > Classe Java.

Nesse momento é importante ressaltar que para o desenvolvimento dos exemplos foi utilizada a versão 1.8.10 da biblioteca PDFBox, bem como as bibliotecas fontbox-1.8.10 e commons-logging-1.1 (elas serão úteis para manipular o recurso de fonte do texto e logar eventuais erros, respectivamente). Para adicionar essas bibliotecas ao projeto, clique com o botão direito em Bibliotecas e depois em Adicionar JAR/Pasta.

Nota: o leitor poderá efetuar o download das bibliotecas Java utilizadas nesse artigo via site >mvnrepository.com. Basta digitar o nome da lib, clicar na versão correta e, em seguida, no link “central”, que o redirecionará para a lista de arquivos disponíveis para download.

O código apresentado na Listagem 1 é responsável por adicionar texto ao PDF apresentado na Figura 1. Nesse caso, será acrescentada uma nova página e nela será colocado um texto de exemplo sem alterar o conteúdo já existente. Portanto, fizemos uso da classe do PDFBox relacionada à criação de uma nova página em um documento: PDPage.


01 import java.io.IOException;
02 import org.apache.pdfbox.exceptions.COSVisitorException;
03 import org.apache.pdfbox.pdmodel.PDDocument;
04 import org.apache.pdfbox.pdmodel.PDPage;
05 import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
06 import org.apache.pdfbox.pdmodel.font.PDFont;
07 import org.apache.pdfbox.pdmodel.font.PDType1Font;
08
09 public class InsercaoConteudoPDF {
10
11     public static void main(String[] args) {
12
13            PDDocument document;
14            try {
15                  File input = new File("src\\Paginas\\ArquivoComConteudo.pdf");
16                  document = PDDocument.load(input);
17                  PDPage page = new PDPage();
18                  document.addPage(page);
19                  PDFont font = PDType1Font.COURIER_BOLD;
20                  PDPageContentStream contentStream = new PDPageContentStream(document, page);
21                  contentStream.beginText();
22                  contentStream.setFont(font, 20);
23                  contentStream.moveTextPositionByAmount(100, 200);
24                  contentStream.drawString("Esse é o conteúdo do documento");
25                  contentStream.endText();
26                    contentStream.close();
27                  document.save("src\\Paginas\\ArquivoComConteudo.pdf");
28
29                  System.out.print("O arquivo foi gerado com sucesso.");
30                  document.close();
31
32            } catch (IOException e) {
33                  e.printStackTrace();
34
35            } catch (COSVisitorException e) {
36                  e.printStackTrace();
37            }
38     }
39 }
Listagem 1. Adição de página com conteúdo a documentos PDF

Linha 15: O documento a ser alterado é carregado. Veja que informamos o caminho onde o mesmo se encontra diretamente no construtor do objeto File (no nosso caso, o pdf está dentro da pasta src do projeto Java).

Linha 16: O documento é preparado para ser utilizado pelo PDFBox;

Linha 18: É adicionada uma nova página ao documento;

Linha 19: É declarado um objeto PDFont, que contém todas as fontes suportadas por um documento PDF;

Linha 20: É instanciada a classe PDPageContentStream, utilizada para manipulação do fluxo de conteúdo no documento;

Linha 21: Utilizamos o método beginText(), responsável por iniciar e liberar o fluxo de escrita no arquivo;

Linha 22: O tamanho da fonte do documento é especificado;

Linha 23: A distância das margens do documento (lateral e superior) é configurada;

Linha 24: É definido o conteúdo que será adicionado no documento;

Linha 25: A edição do documento é finalizada;

Linha 27: O nome e o local para salvar o arquivo são informados.

A Figura 2 apresenta o resultado da execução desse código. Note que agora o documento está com duas páginas, sendo a segunda com o novo conteúdo.


Figura 2. Documento PDF após inserção de conteúdo

Passo 2: Convertendo arquivos PDF para imagens JPG

Neste segundo exemplo, vamos aprender como converter um arquivo PDF em uma imagem no formato JPG. Em muitas situações, principalmente em organizações que arquivam documentos em formato de imagens, é necessário fazer essa conversão. Para isso, o código apresentado na Listagem 2 realiza esse processo utilizando como parâmetro de entrada o mesmo arquivo PDF apresentado no passo anterior. Assim como no primeiro exemplo, deve ser criada uma nova classe, a qual nomearemos de PdfParaImagem.


01 import java.awt.image.BufferedImage;
02 import java.io.File;
03 import java.io.FileInputStream;
04 import java.io.FileNotFoundException;
05 import java.io.IOException;
06 import java.util.Iterator;
07 import java.util.List;
08 import javax.imageio.ImageIO;
09 import org.apache.pdfbox.pdmodel.PDDocument;
10 import org.apache.pdfbox.pdmodel.PDPage;
11
12 public class PdfParaImagem {
13
14    public static void main(String[] args) throws FileNotFoundException, IOException {
15
16          File input = new File("src\\Paginas\\ArquivoComConteudo.pdf");
17          PDDocument doc = PDDocument.load(new FileInputStream(input));
18
19          List<PDPage> pages = doc.getDocumentCatalog().getAllPages();
20          Iterator<PDPage> i = pages.iterator();
21          int count = 1;
22          while (i.hasNext()) {
23                PDPage page = i.next();
24                BufferedImage bi = page.convertToImage();
25                ImageIO.write(bi, "jpg", new File("src\\Paginas\\pdfimage" + count + ".jpg"));
26                count++;
27          }           
28          System.out.println("Conversão Completa!");
29    }
30 }
Listagem 2. Código para conversão em imagens

Linha 21: Contabiliza as páginas do documento. Utilizaremos esse contador como sufixo no nome de cada imagem correspondente à cada página do pdf;

Linha 24: Converte a página selecionada em uma imagem;

Linha 25: Salva a imagem no local passado como parâmetro.

Perceba que esse código é bastante similar ao anterior, no que se refere ao carregamento do arquivo (linha 16) e carregamento do objeto de PDDocument (linha 17). Como resultado, será gravada uma imagem com o mesmo conteúdo de cada página do PDF no diretório definido pelo desenvolvedor. Uma dessas imagens pode ser observada na Figura 3.


Figura 3. . Imagem gerada a partir do PDF