Existe a possibilidade de exibir um relatório gerado pelo ireport em um p:dialog, a classe responsável por gerar e produzir que estou utilizando é esse:
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.jdbc.Work;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.export.Exporter;
import net.sf.jasperreports.export.ExporterInput;
import net.sf.jasperreports.export.OutputStreamExporterOutput;
import net.sf.jasperreports.export.PdfExporterConfiguration;
import net.sf.jasperreports.export.PdfReportConfiguration;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
public class ExecutorRelatorio implements Work {
private String caminhoRelatorio;
private HttpServletResponse response;
private Map<String, Object> parametros;
private String nomeArquivoSaida;
private boolean relatorioGerado;
public ExecutorRelatorio(String caminhoRelatorio,
HttpServletResponse response, Map<String, Object> parametros,
String nomeArquivoSaida) {
this.caminhoRelatorio = caminhoRelatorio;
this.response = response;
this.parametros = parametros;
this.nomeArquivoSaida = nomeArquivoSaida;
this.parametros.put(JRParameter.REPORT_LOCALE, new Locale("pt", "BR"));
}
@Override
public void execute(Connection connection) throws SQLException {
try {
InputStream relatorioStream = this.getClass().getResourceAsStream(this.caminhoRelatorio);
JasperPrint print = JasperFillManager.fillReport(relatorioStream, this.parametros, connection);
this.relatorioGerado = print.getPages().size() > 0;
if (this.relatorioGerado) {
Exporter<ExporterInput, PdfReportConfiguration, PdfExporterConfiguration,
OutputStreamExporterOutput> exportador = new JRPdfExporter();
exportador.setExporterInput(new SimpleExporterInput(print));
exportador.setExporterOutput(new SimpleOutputStreamExporterOutput(response.getOutputStream()));
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=\""
+ this.nomeArquivoSaida + "\"");
exportador.exportReport();
}
} catch (Exception e) {
throw new SQLException("Erro ao executar relatório " + this.caminhoRelatorio, e);
}
}
public boolean isRelatorioGerado() {
return relatorioGerado;
}
}
Mudei essa linha: response.setHeader(“Content-Disposition”, “inline; filename=”"
+ this.nomeArquivoSaida + “”"); de attachment para inline para fazer o relatorio abrir na mesma pagina e não com a opção de download do arquivo.
Meu bean que chama a função da geração do relatório é esse:
@Named
@RequestScoped
public class RelatorioFichaEmergenciaBean implements Serializable {
private static final long serialVersionUID = 1L;
private Long registro;
@Inject
private FacesContext facesContext;
@Inject
private HttpServletResponse response;
@Inject
private EntityManager manager;
public void emitir(ActionEvent event) {
UIParameter parameter = (UIParameter) event.getComponent().findComponent("registroId");
registro = Long.parseLong(parameter.getValue().toString());
Map<String, Object> parametros = new HashMap<>();
parametros.put("registro", registro);
ExecutorRelatorio executor = new ExecutorRelatorio("/relatorios/ficha_emergencia.jasper",
this.response, parametros,"Ficha de Emergência.pdf");
Session session = manager.unwrap(Session.class);
session.doWork(executor);
if (executor.isRelatorioGerado()) {
facesContext.responseComplete();
} else {
FacesUtil.addErrorMessage("A execução do relatório não retornou dados.");
}
}
}
Pensei em usar um ‘p:dialog’ contendo um p:media porém o media não possui atributo do tipo actionListener.
Atualmente faço a chamado do relatório assim:
<p:commandButton value="Ficha de Atendimento" icon="ui-icon-print"
actionListener="#{relatorioFichaEmergenciaBean.emitir}"
update="@form" ajax="false">
<f:param id="registroId" name="registroId"
value="#{cadastroAtendimentoBean.atendimento.registro}" />
</p:commandButton>
Porém para o usuário ficar salvando arquivo pdf para depois ter que usar o visualizador de pdf para abri-lo e somente assim fazer a impressão acaba por gerar um retrabalho enorme, já vi em sistema que quando o usuário clica no botão impressão, abre-se um dialogo com um visualizador de pdf embutido já dando a opção ou dele imprimir ou salvar.
Alguém poderia me direcionar para alcançar o caminho de fazer isso corretamente.