Desenvolvimento - Java

Geração de arquivos PDF com Java - Parte II

Após conhecer o iText, veremos agora alguns métodos dessa API open source que nos permitem uma manipulação maior dos documentos pdf.

por Eric C M Oliveira



Após conhecer o iText, veremos agora alguns métodos dessa API open source que nos permitem uma manipulação maior dos documentos pdf.

Esse artigo é complementar ao artigo já publicado aqui no Linha de Código em 14/11/2005, sob o titulo "Geração de arquivos PDF com Java" (ver referências). Nele tivemos um breve overview da API e informações de como criar seu primeiro arquivo PDF usando uma classe Java. Nosso código fonte de partida será o mesmo apresentado no primeiro artigo. Vale lembrar que os exemplos tem como base o tutorial disponível na web do próprio iText (ver referências).

O tamanho default do pdf gerado pelo iText é o popular A4. Com o método setPageSize podemos alterar esse atributo. Podemos codifica-lo logo após abrirmos esse documento:

document.open();
document.setPageSize(PageSize.A3); // estamos alterando para tamanho A3;

Podemos também adicionar mais páginas ao nosso arquivo pdf, até esse momento com somente uma página. Isso se faz de maneira simples, adicionando via método newPage no nosso objeto PDF:

// adicionando uma nova página
document.newPage();
document.add(new Paragraph("Parágrafo na Segunda Página do Arquivo PDF "));

Para Inserir um background, adicione as linhas de código abaixo:

pageSize.setBackgroundColor(new java.awt.Color(0xFF, 0xFF, 0xDE));

Para a inserção de uma imagem a um documento pdf, basta usar getInstance na figura que você deseja adicionar, passando como parâmetro o seu path e depois adicionar ao seu documento usando o método add():

Image jpg = Image.getInstance("C://logo.jpg");
document.add(jpg);

O iText também permite a encriptação de documentos. Para tal usamos o método setEncryption, que tem na sua assinatura a password para abrir o pdf, como visto abaixo:

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C://PDF_LinhaCodigo2_Encrypted.pdf"));
writer.setEncryption(PdfWriter.STRENGTH128BITS, "PDFJava", "LC", PdfWriter.AllowCopy | PdfWriter.AllowPrinting);	           

Após gerar o pdf, ao tentar acessá-lo, sera apresentado o box para que o usuário digite a senha de acesso do documento:

Vale lembrar que a senha é case sensitive. Ao abrir o pdf, verifique a figura do cadeado no canto esquerdo do documento.

É possivel também inserir os metadados do seu documento, com uso de métodos como addSubject e addAuthor:

document.addSubject("Exemplo Geração PDF em Java"); document.addKeywords("www.linhadecódigo.com.br");
document.addCreator("iText");
document.addAuthor("Eric C M Oliveira");

Essas informações podem ser observadas em File / Properties:

Outras possibilidades de manipulação mais avançada podem ser encontradas em PdfCopy e PdfStamper, que permitem, respectivamente, a inserção do conteúdo de um documento em um segundo pdf e a leitura e/ou alteração de um pdf já existente.

Abaixo temos uma classe que copia o conteúdo de um pdf em um segundo pdf:

package pdfLinhaCodigo;

import java.io.FileOutputStream;
import com.lowagie.text.Document;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;

public class DoisEmUm {
	
   public static void main(String[] args) {
      try {
         // cria o reader para o primeiro pdf
         PdfReader reader = new PdfReader("C://PDF_LinhaCodigo.pdf");
         // n recebe o numero total de páginas
         int n = reader.getNumberOfPages();
         // tamanho da primeira página
         Rectangle psize = reader.getPageSize(1);
         float width = psize.height();
         float height = psize.width();

         // cria segundo pdf
         Document document = new Document(new Rectangle(width, height));
         PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C://SegundoPDF.pdf"));
         document.open();
         // adiciona conteudo ao segundo pdf
         PdfContentByte cb = writer.getDirectContent();
         int i = 0;
         int p = 0;
         while (i < n) {
            document.newPage();
            p++;
            i++;
            PdfImportedPage page1 = writer.getImportedPage(reader, i);
            cb.addTemplate(page1, .5f, 0, 0, .5f, 60, 120);
            if (i < n) {
               i++;
               PdfImportedPage page2 = writer.getImportedPage(reader, i);
               cb.addTemplate(page2, .5f, 0, 0, .5f, width / 2 + 60, 120);
            }
            BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            cb.beginText();
            cb.setFontAndSize(bf, 14);
            cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "page " + p + " of " + ((n / 2) + (n % 2> 
0? 1 : 0)), width / 2, 40, 0);
            cb.endText();
         }
         document.close(); 
      }
      catch (Exception de) {
         de.printStackTrace(); 
      } 
   }
}

Finalizando, além dos tutorais, o iText também disponibiliza um email para questões, duvidas, etc. : itext-questions@lists.sourceforge.net .

Referências:

  • http://www.linhadecodigo.com.br/artigos.asp?id_ac=863

    http://itextdocs.lowagie.com/tutorial/

  • Eric C M Oliveira

    Eric C M Oliveira - Bacharel em Ciencia da Computação/FASP e Comunicação/Unesp, tem experiência em desenvolvimento Java nas plataformas J2SE, J2EE e J2ME, além de atividades ligadas a disciplina de testes, engenharia e qualidade de software. Tem certificações Java SCJP 1.3, SCJP 1.4, Rational Test Management, Rational Robot e RUP (Rational Unified Process).