Criando arquivos PDF em Java

Introdução

Neste artigo rápido, vamos focar na criação de documentos PDF a partir do zero com base na popular biblioteca iText e PdfBox.

Dependências Maven

Vamos dar uma olhada nas dependências Maven, que precisam ser incluídas em nosso projeto:

A última versão das bibliotecas pode ser encontrada aqui: iText e PdfBox.

Uma dependência extra é necessária para adicionar, caso nosso arquivo precise ser criptografado. O pacote Bounty Castle Provider contém implementações de algoritmos criptográficos e é requerido por ambas as bibliotecas:

<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.56</version></dependency>

A última versão da biblioteca pode ser encontrada aqui: The Bounty Castle Provider.

Overview

Both, the iText e PdfBox são bibliotecas java usadas para criação/manipulação de arquivos pdf. Embora a saída final das bibliotecas seja a mesma, elas operam de uma maneira um pouco diferente. Vamos dar uma olhada nelas.

Criar Pdf no IText

4.1. Insira Texto em Pdf

Dê uma olhada, na forma como um novo arquivo com texto “Hello World” é inserido em arquivo pdf

Criar um pdf com uso da biblioteca iText é baseado na manipulação de objetos implementando a interface Elementos no Documento (na versão 5.5.10 há 45 dessas implementações).

O menor elemento que pode ser adicionado ao documento e usado é chamado Chunk, que é basicamente uma string com fonte aplicada.

Adicionalmente, Chunk’s podem ser combinados com outros elementos como Parágrafo, Seção, etc. resultando em documentos de boa aparência.

4.2. Inserindo Imagem

A biblioteca iText fornece uma maneira fácil de adicionar uma imagem ao documento. Nós simplesmente precisamos criar uma instância de Imagem e adicioná-la ao Documento.

4.3. Inserindo Tabela

Podemos enfrentar um problema quando quisermos adicionar uma tabela ao nosso pdf. Felizmente o iText fornece essa funcionalidade fora da caixa.

Primeiro o que precisamos fazer é criar um objeto PdfTable e no construtor fornecer um número de colunas para a nossa tabela. Agora podemos simplesmente adicionar uma nova célula chamando

Agora podemos simplesmente adicionar uma nova célula chamando o método addCell no objeto tabela recém-criado. O iText irá criar linhas de tabela desde que todas as células necessárias estejam definidas, o que significa que assim que você criar uma tabela com 3 colunas e adicionar 8 células a ela, apenas 2 linhas com 3 células em cada uma serão exibidas.

Vamos dar uma olhada no exemplo:

Criamos uma nova tabela com 3 colunas e 3 linhas. A primeira linha será tratada como um cabeçalho de tabela com uma cor de fundo e largura de borda alterados:

A segunda linha será composta de três células apenas com texto, sem formatação extra.

private void addRows(PdfPTable table) { table.addCell("row 1, col 1"); table.addCell("row 1, col 2"); table.addCell("row 1, col 3");}

Podemos incluir não apenas texto nas células, mas também imagens. Adicionalmente, cada célula pode ser formatada individualmente, no exemplo apresentado abaixo aplicamos ajustes de alinhamento horizontal e vertical:

4.4. Criptografia de arquivo

Para aplicar a permissão usando a biblioteca iText, precisamos já ter criado o documento pdf. Em nosso exemplo, usaremos nosso arquivo iTextHelloWorld.pdf gerado anteriormente.

Após carregarmos o arquivo usando o PdfReader, precisamos criar um PdfStamper que é usado para aplicar conteúdo adicional ao arquivo como metadados, criptografia, etc:

Em nosso exemplo, criptografamos o arquivo com duas senhas. A senha de usuário (“userpass”) onde um usuário só tem direito de leitura sem possibilidade de impressão, e a senha do proprietário (“ownerpass”) que é usada como chave mestra permitindo que uma pessoa tenha acesso total ao pdf.

Se quisermos permitir que o usuário imprima pdf, em vez de 0 (terceiro parâmetro do setEncryption) podemos passar:

PdfWriter.ALLOW_PRINTING

Obviamente, podemos misturar diferentes permissões como:

PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY

Calcando que usando o iText para definir permissões de acesso, estamos também criando um pdf temporário que deve ser excluído e, se não for possível, pode ser totalmente acessível a qualquer pessoa.

Criar Pdf no PdfBox

5.1. Inserir Texto em Pdf

Como ao contrário do iText, a biblioteca PdfBox fornece API que é baseada na manipulação de stream. Não há classes como Chunk/Parágrafo etc. A classe PDDocument é uma representação Pdf in-memory onde o usuário escreve dados manipulando a classe PDPageContentStream.

Vejamos o exemplo do código:

5.2. Inserindo Imagem

Inserir imagens é simples.

Primeiro precisamos carregar um arquivo e criar um PDImageXObject, depois desenhá-lo no documento (precisa fornecer coordenadas x,y exatas).

É tudo:

5.3. Inserindo uma Tabela

Felizmente, a PdfBox não fornece nenhum método out-of-box que permita criar tabelas. O que podemos fazer em tal situação é desenhá-la manualmente – literalmente, desenhar cada linha até que nosso desenho se assemelhe à nossa mesa sonhada.

5.4. Criptografia de Arquivos

PdfBox library oferece a possibilidade de criptografar, e ajustar a permissão de arquivos para o usuário. Em comparação com o iText, não requer o uso de um arquivo já existente, pois simplesmente usamos o PDDocument. As permissões de arquivo Pdf são tratadas pela classe AccessPermission, onde podemos definir se um usuário será capaz de modificar, extrair conteúdo ou imprimir um arquivo.

Subseqüentemente, criamos um objeto StandardProtectionPolicy que adiciona proteção baseada em senha ao documento. Podemos especificar dois tipos de senha. A senha de usuário, após a qual a pessoa poderá abrir um arquivo com permissões de acesso aplicadas e senha do proprietário (sem limitações ao arquivo):

Nosso exemplo apresenta uma situação em que se um usuário fornecer a senha de usuário, o arquivo não poderá ser modificado e impresso.

Conclusões

Neste tutorial, discutimos formas de criar um arquivo pdf em duas bibliotecas Java populares.

Exemplos completos podem ser encontrados no projeto baseado em Maven sobre o GitHub.

Comece com Spring 5 e Spring Boot 2, através do curso Learn Spring:

>>> CHECK OUT THE COURSE

Deixe uma resposta

O seu endereço de email não será publicado.