Servlet para gerar PDF - Mudança de página

Gostaria de saber se alguém poderia me ajudar à respeito da mudança de página…

Eu uso:

if( !writer.fitsPage( datatable) ) {

  datatable.deleteLastRow();	//apaga a ultima linha 

  //adiciona ao documento uma nova tabela 
  document.add(datatable);	
  
  //Adiciona uma nova página
  document.newPage();
				
 //Recria a próxima tabela
 ( ... )

}

O problema é que preciso armazenar ou ter um meio de imprimir a linha da tabela que foi deletada sem precisar armazenar todos os dados em variáveis nem ter de reescrever código…

Alguém pode me ajudar???

Valeu!
[color=“red”]Bárbara.[/color]

Barbara,

Uma dica que pode te ajudar…

Você conhece o iText?
Com essa biblioteca vc consegue criar PDFs abstraindo detalhes como paginação, cabeçalhos, rodapés e etc. Basta setar determinados parâmetros que ele cuida de tudo pra vc.

Outra ferramenta ainda mais poderosa é o JasperReports. Com ele vc consegue fazer relatórios sofisticados em PDF, HTML, XML e outros formatos…

Já estava pesquisando no iText,

Mas valeu mesmo assim :wink:

Att,
[color=“red”]Bárbara[/color]

Instancia de que classe é o objeto datatable? talvez exista o método getLastRow() ou o proprio deleteLastRow() retorna a linha deletada!?

De onde vc obtem os dados pra colocar nesta datatable?

Como vc insere os dados na tabela? existe o metodo datatable.insertRow()? que parâmetro ele recebe?

Se vc esclarecer isso vai ficar mais fácil de ajudar!

Dei uma olhada na API do iText e percebi que vc tah usando a classe Table, então faça assim:

[code]if( !writer.fitsPage( datatable) ) {

// copia a ultima linha da tabela antiga para a nova
List ultLinha = new ArrayList();
for (int i = 0; i < datatable.columns(); i++)
ultLinha.add(datatable.getElement(datatable.size()-1,i));

datatable.deleteLastRow(); //apaga a ultima linha

//adiciona ao documento uma nova tabela
document.add(datatable);

//Adiciona uma nova página
document.newPage();

datatable = new Table(ultLinha.size());
for (Iterator iter = ultLinha.iterator(); iter.hasNext():wink: {
Object conteudo = iter.next();
if (conteudo instanceof Cell)
datatable.addCell((Cell) conteudo);
else if (conteudo instanceof Table)
datatable.insertTable((Table) conteudo);
}

} [/code]
Espero que isto possa te ajudar!


Henrique Viecili
Bel. Ciência da Computação - UFSC

Então…

Testei o código que você me passou e ele tem um probleminha… que não consegui desvendar :stuck_out_tongue:

Seria demais pedir pra vc dar mais uma olhada? :oops:

Como você pode ver depois dessa linha que sai errado, ele pula a página normal… então não consegui fazer com que não dê esse erro.

[color=“red”]Obrigada!!![/color] :grin:

Putz… que abuso… :wink: hehehe

parece que a linha que foi desenhada na pagina seguinte é um pedaço da linha da página anterior, certo?!

se isto for verdade, então é pq o if (!writer.fitsPage( datatable)) não deve ter sido executado e o código precisa ser debugado.

caso vc não ache o problema e o código do if seja executado, vc pode retirar duas linhas da tabela ao invés de uma só!

O maior problema eh que quando a célula é muito grande nem tirando duas linhas fuciona bem, não sei porque…, vou ter de dar um jeito de controlar a altura da tabela e a altura da célula pra não escrevê-la se ela for maior que o espaço restante na página.

Valeu pela ajuda!

Bjos,
Bárbara