Dúvida com o Itext

1 resposta
G

Pessoal,

Estou desenvolvendo uma aplicação que gera um documento em pdf e para isso adotei o itext (até mesmo porque já o uso em outras soluções).

Esse documento é composto de uma página inicial que é diferente das demais páginas, sendo assim, possuo um form modelo para a primeira págian e outro para as demais.

Meu problema é que não consigo preencher os dois forms e criar um documento só de duas ou mais páginas com ele…

Não vou postar código pois já fiz tantas tentativas diferentes que se fosse postá-las o tópico ficaria imenso, vou apenas postar o algoritmo para entenderem melhor.

//Suponha que informacoes seja um list com os dados do documento e que cada página possua 10 registros
 int paginas = informacoes.size() / 10; 
  int i = 0;
  int indice = 0;
 while(i <= paginas)
  {
     if(i=0) //primeira página
     {
        form.setField("header", ((Registro)informacoes(0)).getNome())
     }
     for(int cont = indice; cont <= 10; cont++)
     {
        //preenche campos com informacoes(cont)
     }
    adicionaPagina()
    indice+=10;
    i++;
}
saldaDocumento()

Tentei usar um Stamper para o documento principal (que inclui a primeira página) e ir criando outros stamper’s de acordo com a demanda de páginas e adicionar ao stamper princial, mas sempre dá erro. Às vezes cria páginas em branco, às vezes corrompe o documento.

Tentei também usar o PdfCopy e PdfCopyFields, também sem sucesso.

A única forma que encontrei para fazer funcionar, foi criando cada documento fisicamente e depois concatená-los com o PdfCopy, mas assim o IO fica muito grande, além de poder ocorrer algum erro antes da exclusão dos arquivos do disco provocando uso desnecessário de espaço.

Há algum iluminado que tenha já tenha passado por isso e tenha alguma dica para me passar???

Já estou nessa pendenga a uns dois dias e percebo que estou andando em circulos…

Obs.: Os nomes dos campos nos dois formulários (primeira página e demais páginas) são iguais.

1 Resposta

G

Bom…

Eu disse que não iria postar código, mas mudei de idéia e vou colocar o fonte da tentiva mais próxima do sucesso que tive.

public ByteArrayOutputStream testeStamper(String file)throws Exception{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PdfReader reader = new PdfReader("c:\\temp\\fatura_banescard_modelo.pdf");
    
//    String nomePagina1 = "c:\\temp\\" + System.currentTimeMillis()+ ".pdf"; 
    
    PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(file));
    AcroFields form = stamp.getAcroFields();
    form.setField( "EncagosPeriodo", "TESTE ENCARGOS" );
    form.setField( "Demonstrativo", "TESTE DEMONSTRATIVO" );
    form.setField( "DataDemonstrativo", "DATA DEMONSTRATIVO" );
    form.setField( "EncagosProxPeriodo", "TESTE ENCARCOS PROX" );
    form.setField( "JurosMoraProxPeriodo", "TESTE MORA PROX");
    form.setField( "JurosProxPeriodo", "TESTE JUROS PROX");
    stamp.setFormFlattening( true );

    PdfReader reader2 = new PdfReader("c:\\temp\\fatura_banescard_modelo_pag2.pdf");
//    String nomePagina2 = "c:\\temp\\" + System.currentTimeMillis()+ ".pdf";
    PdfStamper stamp2 = new PdfStamper(reader2, new FileOutputStream("c:\\temp\\pagina2.pdf"));
    AcroFields form2 = stamp2.getAcroFields();
    form2.setField( "EncagosPeriodo", "TESTE ENCARGOS 22222" );
    form2.setField( "Demonstrativo", "TESTE DEMONSTRATIVO 22222" );
    form2.setField( "DataDemonstrativo", "DATA DEMONSTRATIVO 22222" );
    form2.setField( "EncagosProxPeriodo", "TESTE ENCARCOS PROX 22222" );
    form2.setField( "JurosMoraProxPeriodo", "TESTE MORA PROX 22222");
    form2.setField( "JurosProxPeriodo", "TESTE JUROS PROX 22222");
    stamp2.setFormFlattening( true );
    
    
    stamp.insertPage(2, PageSize.A4);
    PdfContentByte over = stamp.getOverContent(2);
    //stamp2.close();
    over.addTemplate(stamp2.getImportedPage(reader2, 1) ,0,0);
    stamp.close();
    stamp2.close();

    return baos;
  }

O documento principal é criado com a primeira página e uma outra página em branco. Além dele é criado o documento referente à segunda página (stamp2) no disco;

Aparentemente o problema está na linha over.addTemplate(stamp2.getImportedPage(reader2, 1) ,0,0); , pois a página é criada, o conteúdo é preenchido em um outro documento mas na hora de colocá-lo na nova página não está funcionando.

Criado 5 de junho de 2008
Ultima resposta 5 de jun. de 2008
Respostas 1
Participantes 1