Qual solução adotar para visualizar e imprimir PDF ou TXT lado Cliente numa aplicação Web?

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…