O iText foi criada por Bruno Lowagie. iText é uma biblioteca Java que permite criar PDF, ler PDF e manipular esse tipo de arquivo. Basicamente o iText tem uma Chunk que é a menor unidade de texto, como uma String com uma fonte pré-definida. Uma Phrase combina várias Chunks e permite definir o espaçamento das linhas. Um Paragraph é uma subclasse de Phrase e permite definir mais atributos de layout, como margens por exemplo. Temos também a classe Anchor que é subclasse de Paragraph e serve como base para hyperlinks no PDF gerado, Chapter, Section e Image que serão melhores detalhados posteriormente nas próximas seções do artigo.

O Download do código fonte ou do binário do iText pode ser feito clicando aqui.

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. Esses objetos permite que possamos gerar documentos PDF sem nos preocuparmos com a sintaxe do PDF. Conceitualizaremos e exemplificaremos os seguintes blocos básicos de construção utilizados no iText: Anchor, Chapter, Section e Image.

Anchor

Em vários tipos de aplicativos temos a ideia das "ancoras". Por exemplo, na web temos os hyperlinks que permitem a mudança de páginas. Arquivos PDF também permitem esse tipo de funcionalidade. Existem diferentes formas de adicionar um link a um arquivo PDF usando iText.

Segue na Listagem 1 um exemplo utilizando o objeto Anchor.


import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Anchor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.pdf.PdfWriter;
 
 
public class ObjetoAnchor {

   public static final String RESULT = 
    "C:\\Users\\higor\\Desktop\\proj_iText\\arqPDFexemplo.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 pais = new Paragraph();
         Anchor dest = new Anchor("Brasil");
         dest.setName("LinkAnchorBrasil");
         pais.add(dest);
         pais.add(" ");
         pais.add("Argentina");

         document.add(pais);

         document.newPage();

         Anchor toBrasil = new Anchor("Volta para primeira página.");
         toBrasil.setReference("#LinkAnchorBrasil");

         document.add(toBrasil);

         document.close();
   }
}
Listagem 1. Exemplo utilizando o objeto Anchor

Neste exemplo foi criado um objeto Anchor com um nome e um texto que serve como destino. Isto seria como em HTML, onde "LinkAnchorBrasil" é como se fosse o id.

Também podemos criar um link para uma referência externa, dessa forma poderíamos fazer da mesma forma que a Listagem 2.


import java.io.FileOutputStream;
import java.io.IOException;

import com.itextpdf.text.Anchor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.pdf.PdfWriter;


public class ObjetoAnchor2 {

   public static final String RESULT = 
   "C:\\Users\\higor\\Desktop\\proj_iText\\arqPDFexemplo.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();

         Anchor google = new Anchor("Link para o Google");
         google.setReference("http://www.google.com");

         document.add(google);

         document.close();
   }
   
}
Listagem 2. Exemplo utilizando objeto Anchor para referências externas

Existem também outras formas de referenciar objetos além do Anchor. Podemos fazer isso através do objeto Chunk com uso do Remote GOTO, Local Destination, ou Local GOTO Chunks. Para isso temos o Chunk.setLocalDestination() que corresponde ao Anchor.setName(), Chunk.setLocalGoto() que corresponde ao Anchor.setReference() e Chunk.setRemoteGoto() que pode referenciar uma URL externa, uma página em outro documento PDF ou um destino em outros documento PDF.

Chapter e Section

Com PDF podemos organizar o conteúdo através de capítulos que podem conter um ou mais objetos de sessão. Segue na Listagem 3 um exemplo de código para começarmos a discussão sobre Chapter e Section.


import java.io.FileOutputStream;
import java.io.IOException;

import com.itextpdf.text.Chapter;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Section;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;


public class ObjetoChapter {

   public static final String RESULT = 
   "C:\\Users\\higor\\Desktop\\proj_iText\\arqPDFexemplo.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 title = new Paragraph("Titulo 1");
         Chapter chapter = new Chapter(title, 1);
         
         title = new Paragraph("Titulo 2");
         Section section = chapter.addSection(title);
         section.setBookmarkTitle("Teste");
         section.setIndentation(30);
         section.setBookmarkOpen(false);
         section.setNumberStyle(Section.NUMBERSTYLE_DOTTED_WITHOUT_FINAL_DOT);
         
         title = new Paragraph("Titulo 3");
         section.add(title);
         
         title = new Paragraph("Titulo 4");
         
         Section subsection = section.addSection(title);
         subsection.setIndentationLeft(20);
         subsection.setNumberDepth(1);
         
         title = new Paragraph("Titulo 5");
         subsection.add(title);
         
         document.add(chapter);

         document.close();
   }

}
Listagem 3. Exemplo utilizando Chapter e Section

Podemos notar algumas características dos objetos neste código. O objeto Chapter recebe como parâmetro o número do capítulo quando estamos construindo um Chapter. Por default temos a inclusão de um ponto ao número, mas podemos alterar isto através do método setNumberStyle(). Os objetos Section são criados através do método addSection(). O título é passado por parâmetro quando estamos construindo um Chapter ou um Section. Se quisermos alterar o título podemos usar o método setBookmarkTitle(). A endentação também pode ser altera pelos métodos setIndentation() tanto de Chapter quanto de Section. Vale ressaltar que apenas é alterada a endentação do conteúdo e isto não afeta o título. Para alterar a endentação do título e do conteúdo utilizamos setIndentationLeft() e setIndentationRight().

Image

Para adicionar uma imagem num documento PDF é bastante simples. O exemplo da Listagem 4 ilustra como exibir uma imagem.


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.Image;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;


public class ObjetoImage {

     public static final String RESULT =
      "C:\\Users\\higor\\Desktop\\proj_iText\\arqPDFexemplo.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 final String RESOURCE = 
      "C:\\Users\\higor\\Documents\\java.png";
     
     public static void main(String[] args) throws 
      DocumentException, IOException {
           Document document = new Document();
           PdfWriter.getInstance(document, new FileOutputStream(RESULT));
           document.open();

           document.add(new Paragraph("Titulo Imagem"));
           document.add(
           Image.getInstance(String.format(RESOURCE)));

           document.close();
     }
     
}
Listagem 4. Exemplo utilizando o objeto Image

Substitua o caminho do RESOURCE por um caminho onde esteja uma imagem.

iText possui diferentes classes para diferentes tipo de imagens, são eles: Jpeg, PngImage, GifImage, TiffImage, etc. Essas classes estendem Image ou podemos criar uma instância de uma classe Image. Podemos criar uma imagem usando essas classes, porém se utilizarmos a classe Image ela se encarregará de inspecionar o binário da imagem e decidir qual das classes ele deverá utilizar.

Utilizando Image também podemos alterar a posição da imagem. Para isso temos o método setAlignment(). Os valores possíveis são: Image.LEFT, Image.CENTER, ou Image.RIGHT. Com isso definimos a posição da imagem na página. Também temos o Image.TEXTWRAP ou Image.UNDERLYING que são utilizados quando adicionamos uma imagem seguida por um texto no documento. O texto pode ser posicionado acima ou abaixo da imagem. UNDERLYING posiciona acima da imagem e TEXTWRAP posiciona ao lado, exceto quando utilizamos Image.CENTER. Segue na Listagem 5 um exemplo.


Image imagem = Image.getInstance(String.format(RESOURCE));
imagem.setAlignment(Image.LEFT | Image.TEXTWRAP);
             
document.add(imagem);
Listagem 5. Posicionando uma imagem

Também podemos posicionar uma imagem utilizando setAbsolutePosition() definindo as coordenadas X e Y. Com isso a imagem será posicionada de baixo para esquerda.

O iText também disponibiliza os métodos setBorder, setBorderWidth e setBorderColor para que possamos alterar a borda da imagem. Outra funcionalidade é o método scaleToFit(). Os métodos getWidth() e getHeight() retornam as dimensões da imagem. Também podemos rotacionar a imagem com setRotationDegrees(), como por exemplo, img.setRotationDegrees(-30).

Ainda temos disponíveis os métodos getPlainWidth(), getScaledWidth(), getScaledHeight() e getPlainHeight(). Fica como exercício ao leitor testar cada um desses métodos. A melhor forma é alterar alguns valores e visualizar como fica a imagem após as alterações.

Neste artigo vimos uma introdução aos blocos básicos de construção utilizados no iText. No total temos nove blocos de construção bastante utilizados, são eles: Chunk, Phrase, Paragraph, List, ListItem, Anchor, Chapter, Section, e Image. Neste artigo conceitualizamos e exemplificamos os blocos básicos de construção Anchor, Chapter, Section e Image. Com este artigo encerramos a nossa discussão sobre os blocos básicos de construção. Como os leitores solicitaram mais artigos sobre o iText estarei trazendo novos assuntos nos próximos artigos. Novamente agradeço aos e-mails e solicitações dos nossos leitores.

Bibliografia: