É muito comum com sistemas feitos em Java Web o usuário ter que baixar o PDF para poder visualizar um relatório ou em outros casos é aberto o visualizador de PDF em uma outra aba, tendo assim o usuário que clicar em imprimir e depois fechar aba.
Estou escrevendo esse tutorial para mostrar como você pode solucionar este problema fazendo com que ao usuário clicar em relatório seja aberto o relatório direto com a janela de impressão do Chrome e ao Imprimir ou Cancelar seja fechado a aba.

Veja como abrir a janela de impressão do Chrome com seus relatórios feitos em Java .

Mostrarei como fazer utilizando JSF sendo possível com algumas modificações na chamada do relátorio utilizar com JSP.

Bibliotecas utilizadas no exemplo:

Usuário Maven:

//PrimeFaces
<dependency>  
    <groupId>org.primefaces</groupId>  
    <artifactId>primefaces</artifactId>  
    <version>6.0</version>  
</dependency> 

//OmniFaces
<dependency>
	<groupId>org.omnifaces</groupId>
	<artifactId>omnifaces</artifactId>
	<version>1.8.3</version>
</dependency>

Ou download diretamente em:
PrimeFaces:https://www.primefaces.org/downloads/

OmniFaces:http://omnifaces.org/

1 – Primeiro passo é criarmos nosso xhtml que será responsável por exibir o relátorio e abrir a janela de impressão do navegador.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style>
html, body {
	height: 100%;
	margin: 0;
	overflow: hidden;
}
</style>
<script type="text/javascript">
function loadPrint() {
	var x = document.getElementById("frame");
	setTimeout(function () { x.contentWindow.print(); }, 500);
    window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
}
</script>

<title>Impressão de Relatórios</title>
</head>
<body>
	<iframe src="#{request.contextPath}/pdf?#{request.queryString}" id="frame" 
			width="100%" height="100%" onload="loadPrint()"  />
</body>
</html>
pdf.xhtml

Foi utilizado uma função JavaScript que será responsável por abrir a janela de impressão do navegador ao carregar a página e fechar quando o usuário clicar em Imprimir ou fechar o relátorio.

2 – Segundo passo é definirmos qual relatório será carregado.

Estou utilizando OmniFaces que é uma biblioteca com vários métodos já prontos que agilizam o desenvolvimento pra quem utiliza Jsf.

public void imprimir(){
	//Caminho do relatório dentro da pasta WebContent
	String caminho = Faces.getRealPath("/reports/comprovante_pagamento.jasper");
			
	try{
		//Aqui chamamos no xhtml passando o caminho do 
		//nosso relátório e os parametros que desejamos
		RequestContext.getCurrentInstance()
			          .execute("window.open('" +Faces.getRequestContextPath() 
					  + "/pages/pdf.xhtml?faces-redirect=true"
					  +	"&jrxml=" + URLEncoder.encode(caminho, "UTF-8") + ""
					  + "&idpagamento="+pagarReceber.getId()+"')");
	}catch(Exception e){
		e.printStackTrace();
	}  		
}
Método Imprimir

A função “getRealPath” do OmniFaces retorna o caminho real do arquivo na aplicação no momento que está sendo executada.
Utilizamos o método “execute” do PrimeFaces passando a função “window.open” com o caminho do nosso relatório e os paramêtros necessários para seu relátorio.
Utilizamos o “URLEncoder.encode(caminho, “UTF-8”)” para converter o caminho de nosso arquivo para uma URL válida.

3 – Criar a servlet que nos retornará nosso relatório em PDF

@WebServlet("/pdf")
public class PdfServlet extends HttpServlet{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
		throws ServletException, IOException {
		
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		HashMap<String, Object> parametros =  new HashMap<String, Object>();
		
		//Caminho do nosso relatório
		String jrxml = request.getParameter("jrxml");
		
 		//Paramentro do nosso relatório
		String idpagamento = request.getParameter("idpagamento");
		parametros.put("ID_PAGAMENTO",idpagamento);
			
		//Gerar relatório
		try{
			JasperPrint print = JasperFillManager.fillReport(jrxml,parametros, ServiceLocator.getConexao());
			JasperExportManager.exportReportToPdfStream(print, baos);
			
			//Adiciona nosso pdf no response
			response.setContentType("application/pdf");
			response.setContentLength(baos.size());
			response.setHeader("Content-disposition", "inline; filename=relatorio.pdf");
			response.getOutputStream().write(baos.toByteArray());
			response.getOutputStream().flush();
			response.getOutputStream().close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
PdfServlet.java

 

Dessa forma quando usuário clicar em visualizar o relatório será chamado nosso xhtml abrindo a janela de Impressão no Chrome e no Mozila o visualizador de PDF.

3 COMENTÁRIOS

DEIXE UMA RESPOSTA