Pessoal, apesar de pesquisar não consegui fazer funcionar a opção de gerar um PDF na minha página Web e exibir para o cliente para poder visualizar e imprimir.
O relatório é gerado usando JasperReport
e minha dúvida é se teria algo como:
JasperPrintManager.printReport(impressao, true);
JasperPrintManager.printPage(impressao, 0,true);
Com isso é exibido um dialog
onde seleciona a impressora, mas só funciona no lado Servidor!
A idéia é o cliente ter sua impressora instalada na sua máquina ou até bluetooth e poder imprimir!
Basicamente é só você escrever o arquivo no response da sua requisição.
O browser do cliente é que vai se encarregar de fazer download ou abrir um visualizador de PDF de acordo com as configurações dele.
Neste post tem um exemplo.
Todos esses dias na luta e ainda não consegui resolver! Caso alguém possa ajudar fico grato! O que consegui ate agora foi: Ao clicar no botão Finalizar o PDF é exibido substituindo a tela.
o botão:
<p:commandButton value="Finalizar"
action="#{controller.finalizarJogo()}" ajax="false">
</p:commandButton>
public String finalizarJogo() throws JRException, IOException {
// faço a logica de salvar os números selecionados e chamo pra imprimir o jogo
imprimirJogo();
}
public void imprimirJogo() throws JRException, IOException {
FacesContext context = FacesContext.getCurrentInstance();
ServletContext servletContext = (ServletContext) context.getExternalContext().getContext();
String caminhoRelatorio = servletContext.getRealPath("/relatorios/jogo/jogo.jasper");
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
HashMap<String, Object> mapFicha = new HashMap<String, Object>();
mapFicha.put("numeros", numerosSelecionados);
List jogo = Collections.singletonList(meuObjeto);
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(jogo, false);
JasperPrint impressao = JasperFillManager.fillReport(caminhoRelatorio, null, dataSource);
final JRPdfExporter exporter = new JRPdfExporter();
SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
configuration.setPdfJavaScript(PdfExporterConfiguration.PROPERTY_PDF_JAVASCRIPT);
// algumas postagens falava que isso deveria funcionar, mas nao foi...
// configuration.setPdfJavaScript("this.print()");
exporter.setConfiguration(configuration);
exporter.setExporterInput(new SimpleExporterInput(impressao));
exporter.setExporterOutput(new
SimpleOutputStreamExporterOutput(response.getOutputStream()));
response.setContentType("application/pdf");
response.setHeader ("Pragma", "public");
response.setHeader("Cache-control", "must-revalidate");
response.setHeader("Content-disposition", "inline; filename=jogo.pdf");
JasperExportManager.exportReportToPdfStream(impressao, response.getOutputStream());
FacesContext.getCurrentInstance().renderResponse();
exporter.exportReport();
PrimeFaces.current().executeScript("PF('finalizadoSucesso').show();");
FacesContext.getCurrentInstance().responseComplete();
}
ao chamar imprimirJogo()
exibe o PDF(tentei com txt, mas fez o download vazio) na própria URL
ex:localhost:8080/jogo/home.xhtml. quando clico em finalizar exibe o PDF sem alterar a URL
O ideal seria exibir o arquivo em um dialog
e poder selecionar a impressora ou fechar a janela.
o setDisplayPrintDialog
só funciona no lado servidor. Talvez em Txt
fosse até melhor pois nao precisaria instalar leitor pdf caso a maquina não tivesse, mas também nao consegui…