JasperReport - PDF multiplas folhas [resolvido]

Pessoal, preciso de uma ajuda, a duas semanas começei a ter que estudar JasperReport para um projeto aqui na empresa, fiz alguns relatórios e tudo ok. Mas agora estou me deparando com o seguinte problema:

Observações:

1º na minha aplicado gero um hashmap com os parâmetros que deverão ser lançados para o jasper :


       HashMap parameters = new HashMap();

       parameters.put("nome_assinante", "Guilherme Vargas");
       parameters.put("codigo_assinante", "01540054000166008");

       //suponha que tenha um método aqui que gera esses dados necessários.

       jasperPrint = JasperFillManager.fillReport(this.getClass().getResourceAsStream("./jasper/RelatorioProfissionalTeste.jasper"), parameters, new JREmptyDataSource());
       ...

depois que é gerado os bytes o sistema lança para o usuário realizara o download do arquivo.

2º esse relatório(ficha), contém apenas uma página.

Objetivo (problema):

Existe alguns campos fixos na ficha que vão de 1 á 5, mas os parâmetros enviados podem ser 1 á 25. Como eu faço para poder gerar esse relatório em um único arquivo ? todos os parâmetros podem ser os mesmos, os únicos dados que mudam sãos esses campos. Tem alguma expressão que posso usar no jasper? ou tem jeito de eu gerar vários relatórios e concatenar os bytes(viajem eu acho) e juntar em um único arquivo para download?

Obrigado, espero que alguem consigua me ajudar.

Tá um pouco confuso o teu texto cara…

Você quer dizer que não cabem os parametros no relatório?
Você quer gerar vários relatórios e juntá-los?
Você só vai passar parametro para o jasper? Eles têm algum padrão?

Tente explicar melhor o teu relatório, do que se trata, qual o formato, quais dados se repetem, quais serão fixos…

ok, desculpe me…vou respoder as perguntas pois fica mais fácil.

inicialmente a específicação previa somente 5 campos de descrição de problema, mas houve uma alteração depois de finalizado e liberado para o cliente, existem clientes que podem gerar até 25 descrições de problemas, e agora é necessário que seja gerado várias folhas iguais mudando somente esses novos campo adicionais.

Você quer dizer que não cabem os parametros no relatório?
Não cabem, pois estão fixos, mas posso alterar mas não sei como ‘não deixa-los fixos’ pois os dados são preenchidos por um hashmap.

Você quer gerar vários relatórios e juntá-los?
Isso foi uma idéia. Não sei se é possível.

Você só vai passar parametro para o jasper? Eles têm algum padrão?
Sim, só passo a hashmap dos os dados. E sim tem padrões.

Estou vendo aqui algumas coisas do método addPage(), talvez seja um caminho…

Grato,

[quote=guilhermevh]ok, desculpe me…vou respoder as perguntas pois fica mais fácil.

Você quer dizer que não cabem os parametros no relatório?
Não cabem, pois estão fixos, mas posso alterar mas não sei como ‘não deixa-los fixos’ pois os dados são preenchidos por um hashmap.

Você quer gerar vários relatórios e juntá-los?
Isso foi uma idéia. Não sei se é possível.

Você só vai passar parametro para o jasper? Eles têm algum padrão?
Sim, só passo a hashmap dos os dados. E sim tem padrões.

Estou vendo aqui algumas coisas do método addPage(), talvez seja um caminho…

Grato,[/quote]

Notei que você está passando os dados via parametros. Uma saída legal seria você ter um JRBeanCollectionDataSource, onde você teria todos os beans/classes. È como se fosse um List de Cliente por exemplo. Aí no jasper você consegue iterar sobre este Datasource e mostrar os dados, sejam quantos vierem, 1, 5 ou 500…

Procure por JRBeanCollectionDataSource. Na documentação do JasperReports certamente tem exemplos.

Qualquer dúvida pode perguntar…

então, mas o problema é que o layout não pode mudar, por folha pode somente ser exibido 5 descrições de problema, então sempre que sobrar 1 tem que ter uma página a mais, com todos os dados repetidos e as novas descrições. Como eu fasso isso? (se eu interar sequencialmente o layout é alterado).

Vou vendo o JRBeanCollectionDataSource para melhor o padrão, mas ainda tenho a dúvida acima…

Obrigado…

Agora entendi! Dá pra fazer isso sim…

Você quer algo assim?

Cliente: XXX
Endereço: Xxxxx, 999 - YYY
Cidade: XXXXX
Estado: XXXXX

Problema 1
Problema 2
Problema 3
Problema 4
Problema 5

Folha 2

Cliente: XXX
Endereço: Xxxxx, 999 - YYY
Cidade: XXXXX
Estado: XXXXX

Problema 6
Problema 7

Acredito que você deva usar a banda PAGE_HEADER para colocar os dados repetidos.

Quanto aos 5 registros por folha, o negócio é um pouco complexo. Você deve usar o componente quebra de página. Dentro desse componente (em printWhenExpression) você deve fazer um teste com um contador (crie uma variável dentro do jasperreports para esse contador), mais ou menos assim: new Boolean($V{contador}.intValue() % 5 == 0). Isso diz que a quebra vai ser acionada de 5 em 5 registros, pulando pra próxima página. :shock:

Pode ser que haja um método mais fácil, porém o desconheço. :x

Sensacional…é exatamente isso…

Ajudou muito, vai ser assim mesmo que vai ser, vou fazer um refactor aqui para poder utilizador esse método que você disse, fiz um teste simples e ok.

E em paralelo achei um modo que também funciona, não muito elegante mas ajuda( pode gerar lentidão no sistema, mas é uma solução…) segue abaixo:

            .... 
            //primeira página gerada 
            jasperPrint = JasperFillManager.fillReport(this.getClass().getResourceAsStream("./jasper/RelatorioServicos.jasper"), parameters, new JREmptyDataSource());

            // um for aqui gera um jasper print para cada relatório gerado, pegando a primeira página no get(0)...(já que sempre será gerado 1 página)
            JRPrintPage paginasGerada = (JRPrintPage) JasperFillManager.fillReport(this.getClass().getResourceAsStream("./jasper/RelatorioServicos.jasper"), 
                                            parameters, new JREmptyDataSource()).getPages().get(0);

            //adiciona no jasperPrint cada página recuperada
              jasperPrint.addPage(paginasGerada );

            return JasperExportManager.exportReportToPdf(jasperPrint);
            ....

no fim, todas as páginas geradas estarão em um só arquivo…

Obrigado mais uma vez…

Legal cara…

Não acredito em lentidão percebida a olho nu. A não ser que tenhas um relatório de mais de 1000 folhas…