Tem como jogar o PDF do jasper direto no response?

Galera alguem sabe se tem como, ou se tem algum link falando sobre o assunto? Eu estou usando o JasperReport para gerar PDF e está funcinando bem, mas não quero gerar o arquivo em disco. Quero transformar o JasperPrint em PDF em memória em envia-lo direto ao browser do cliente. Tem um método que teoricamente faria isso, mas quando uso ele em conjunto com o struts da um erro. Pois eu tenho que pegar o OutputStream do response, e dai no struts ele fala que o OutputStream ja foi chamado.

O método que tentei usar foi esse aqui:

JasperExportManager.exportReportToPdfStream( print, out )

Assim voce coloca algo em bytes no response… um PDF por exemplo!

// Gera o relatorio pdf e pega ele em bytes, tem varias maneiras para fazelo...
byte[] pdfBytes = Jasper...
if (pdfBytes != null) {
     // OutputStream  do response
     OutputStream os = response.getOutputStream();
     os.write(pdfBytes);
     os.flush();
     os.close();
     // informa o tipo de arquivo sendo enviado
     response.setContentType("application/pdf");
}

[]s
Lucas Balensiefer

Eu ja fiz isso. O problema é que depois de fazer isso no action do struts ele da pau la no JSP dizendo que o OutputStream ja foi usado. Não queria fazer um Servlet somente para enviar o PDF ao browser mas acho que não tem como criar um action no struts para fazer isso :sad: . Mesmo assim valew a ajuda. :wink:

Consegui. Fiz isso aqui ó:

 public ActionForward execute( ActionMapping actionMapping, ActionForm actionForm,
    HttpServletRequest request, HttpServletResponse response )
    throws Exception
  {
    ActionErrors errors = new ActionErrors();
    RelatorioForm form = (RelatorioForm) actionForm;

    try
    {
      BusinessObject bo = (BusinessObject) BusinessObject.getInstance();
      List list = bo.listaTodos();

      //Fonte de dados que implementei. Recebe um list de VOs e o tipo de       
     //VO no construtor.
      JRDataSourceVOs jrDs = new JRDataSourceVOs( 
              list, TesteVO.class.newInstance() );

      InputStream jasperFile  = Thread.currentThread().getContextClassLoader().getResourceAsStream(
      "relatorio.jasper" ) ;
      
     //diz ao browser que é um arquivo pdf e tem nome.
      response.setContentType("application/pdf");
      response.setHeader("Content-disposition","filename=relatorio.pdf");    
     
      //pega a saida 
      ServletOutputStream out = response.getOutputStream();
      
      //Cria o JasperPrint            
      JasperPrint print = JasperFillManager.fillReport( fileRel, null, jrDs );
     
     //Exporta o PDF para a saida
      JasperExportManager.exportReportToPdfStream( print, out);

      //Chama um mapiamento que não existe.
      return ( actionMapping.findForward( "none" ) );
    }
    catch ( Exception e )
    {
      errors.add( ActionErrors.GLOBAL_ERROR, new ActionError( "Teste" ) );
      getServlet().log( "Erro = " + e, e );
    }

      saveErrors( request, errors );
      return ( actionMapping.findForward( "failure" ) );
  }

Não sei se é a melhor maneira de implementar isso mas funciona com o struts.