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 OliveiraEsse 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: