O iText é uma biblioteca de código fonte aberto que nos permite criar e manipular documentos PDF. Atualmente ele está disponível para Java, .NET e Android. Como o código é aberto o iText está disponível nas licenças LGPL e MPL.

Clique aqui para baixar o jar do iText.

Basta colocar o jar no classpath do Eclipse e usar a ferramenta na IDE. Para fazer isso, basta clicar com o botão direito do mouse no nome do projeto e selecione as propriedades. Após isso, selecione a aba “Java Build Path” e “Libraries”. Por fim, clique em “Add jar” selecionando o jar salvo. A Figura 1 mostra a janela do Java Build Path.

Janela Java Build Path do Eclipse
Figura 1. Janela Java Build Path do Eclipse

Nas próximas seções veremos melhor os blocos básicos de construção utilizados no iText. Esses objetos são considerados como sendo de alto nível e permite que possamos gerar documentos PDF sem nos preocuparmos com a sintaxe do PDF.

No restante do artigo conceitualizaremos e exemplificaremos os seguintes blocos básicos de construção utilizados no iText: Paragraph, List e ListItem.

Paragraph

O objeto Paragraph é como o objeto Phrase com algumas propriedades a mais e um objeto NEWLINE. A classe Paragraph é derivada da classe Phrase. A diferença entre Phrase e Paragraph é como a diferença no HTML entre que é utilizado como um elemento único, e que é um incorporador de elementos. O Paragraph ainda define alinhamento de texto, diferente endentações e espaços antes e após o parágrafo.

Segue na Listagem 1 um exemplo de como utilizar o objeto Paragraph.


import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.pdf.PdfWriter;
 
public class ObjetoParagraph {
 
  public static final String RESULT = 
   "C:\\Users\\higor\\Desktop\\proj_iText\\arqPDFexemplo5.pdf";
       
  public static final Font BOLD_UNDERLINED = new 
    Font(FontFamily.TIMES_ROMAN, 12, Font.BOLD | Font.UNDERLINE);
  public static final Font NORMAL = new Font(FontFamily.TIMES_ROMAN, 12);
 
       
  public static void main(String[] args) throws DocumentException, 
    IOException {
       Document document = new Document();
       PdfWriter.getInstance(document, new FileOutputStream(RESULT));
       document.open();
 
       Paragraph p = new Paragraph();
       p.add(new Phrase("Titulo: ", BOLD_UNDERLINED));
       p.add("Teste de Titulo");
       p.setAlignment(Element.ALIGN_JUSTIFIED);
       p.setIndentationLeft(18);
       p.setFirstLineIndent(-18);
       p.add(" ");
       p.add(new Phrase("Titulo 2: ", BOLD_UNDERLINED));
       p.add("Teste de Titulo 2");
             
       document.add(p);
 
       document.close();
  }
}
Listagem 1. Exemplo utilizando o objeto Paragraph

Tente alterar os valores setados e veja a diferença que ocorre no PDF gerado. O método setAlignment() seta o alinhamento do texto. Isto faz com que o iText altere os espaços entre palavras e caracteres. O iText ainda disponibiliza quatro tipos de alinhamento, são eles: o Element.LEFT, Element.ALIGN_CENTER, e Element.RIGHT que é similar ao Element.ALIGN_JUSTIFIED. Outro método bastante utilizado é para modificar a endentação. Para isso temos três métodos, são eles: setIndentationLeft(), setIndentationRight() e setFirstLineIndent(). O método setIndentationLeft() é utilizado para alterar a endentação para esquerda. O método setIndentationRight() faz a mesma coisa que o método setIndentationLeft(), porém com a margem direita. Por fim, o método setFirstLineIndent() altera a endentação esquerda da primeira linha o que fica bastante interessante no visual do texto.

Outra funcionalidade interessante dos parágrafos é a possibilidade de adicionar um espaço extra antes ou depois do parágrafo. Para isso, podemos utilizar o método setSpacingAfter() e setSpacingBefore().

List e ListItem

O objeto List é uma sequência de Paragraphs chamados ListItem. Por sua vez, ListItem é um paragrafo que pode ser adicionado a uma List. A classe ListItem estende a classe Paragraph. A principal diferença é que todo ListItem tem uma variável Chunk que age como uma lista de símbolos.

Na Listagem 2 segue um exemplo simples de como utilizar o objeto List.


import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.List;
import com.itextpdf.text.ListItem;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.pdf.PdfWriter;
 
 
public class ObjetoList {
 
  public static final String RESULT = 
    "C:\\Users\\higor\\Desktop\\proj_iText\\arqPDFexemplo7.pdf";
       
  public static final Font BOLD_UNDERLINED = new 
   Font(FontFamily.TIMES_ROMAN, 12, Font.BOLD | Font.UNDERLINE);
  public static final Font NORMAL = new Font(FontFamily.TIMES_ROMAN, 12);
 
       
  public static void main(String[] args) throws DocumentException, 
   IOException {
       Document document = new Document();
       PdfWriter.getInstance(document, new FileOutputStream(RESULT));
       document.open();
       List list = new List();
             
       ListItem item = new ListItem("Teste List", BOLD_UNDERLINED);
       
       ListItem listItem = new ListItem("Teste ListItem");
       item.add(listItem);
       list.add(item);
             
       document.add(list);
 
       document.close();
  }
}
Listagem 2. Exemplo utilizando o objeto List

Segue na Listagem 3 outra forma de criar List e ListItem.


List list = new List(true, 20);
list.add(new ListItem("Primeira Linha"));
list.add(new ListItem("Essa linha tem o intuito de ser um pouco maior que uma linha apenas. 
Por isso estamos nos alongando neste texto para ver o que acontece, será que uma nova linha é 
criada ou teremos tudo numa mesma linha?"));
list.add(new ListItem("Terceira Linha"));
Listagem 3. Outras forma de criar List e ListItem

Vale ressaltar que não é necessário criar uma instância de ListItem. Podemos também adicionar itens como String diretamente para um List. Um ListItem será criado internamente. Como exercício o leitor poderá testar o exemplo dado criando diversos ListItem e adicionando ao List criado na primeira linha.

Também existem outros tipos de listas como RomanList, GreekList, e ZapfDingbatsNumberList. Para utilizarmos esses tipos de lista basta criar uma lista com, por exemplo, "List list = new RomanList()". ZapfDingbatsNumberList é fortemente recomendado para ser utilizado em listas mais longas.

Segue na Listagem 4 um exemplo utilizando RomanList.


import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.List;
import com.itextpdf.text.ListItem;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.RomanList;
import com.itextpdf.text.pdf.PdfWriter;
 
 
public class ObjetoRomanList {
 
  public static final String RESULT =     
   "C:\\Users\\higor\\Desktop\\proj_iText\\arqPDFexemplo7.pdf";
 
  public static final Font BOLD_UNDERLINED = new  
   Font(FontFamily.TIMES_ROMAN, 12, Font.BOLD | Font.UNDERLINE);
  public static final Font NORMAL = new Font(FontFamily.TIMES_ROMAN, 12);
 
 
  public static void main(String[] args) throws DocumentException, 
   IOException {
       Document document = new Document();
       PdfWriter.getInstance(document, new FileOutputStream(RESULT));
       document.open();
 
       List list = new RomanList();
                    
       ListItem item1 = new ListItem("Teste ListItem 1", BOLD_UNDERLINED);
       ListItem item2 = new ListItem("Teste ListItem 2", BOLD_UNDERLINED);
       ListItem item3 = new ListItem("Teste ListItem 3");
 
       item1.add(item3);
             
       list.add(item1);
       list.add(item2);
             
       document.add(list);
 
       document.close();
  }
}
Listagem 4. Exemplo utilizando RomanList

Neste artigo vimos uma introdução aos blocos básicos de construção utilizados no iText.

Novamente peço aos leitores para continuarem enviando suas dicas de assuntos. Também agradeço pelos muitos elogios e também dicas para melhorarmos cada vez mais.

Bibliografia: