PrimeFaces/JasperReport - Dialog de Resposta acaba com formatação do css

Poxa ta difícil para o meu lado aqui.
Eu tenho telas para gerar relatórios, que se usuário informar parâmetros que não são encontrados no banco o relatório não deve aparecer.
Em todos os lugares que eu pesquisei para gerar o relatório para download na tela não posso usar ‘ajax=true’ no ‘commandButton’, até ai tudo bem. Se os parâmetros informados retornam dados no banco o PDF é gerado normalmente para download, mas caso seja ao contrario eu emito uma mensagem informando a falta de dados, ela até aparece mas acaba com todo o layout css da tela, aumenta todas as fontes e etc.
Se eu informar ‘ajax=true’ a mensagem aparece do jeito que eu quero, mas o relatório não gera por nada o download.

É mais ou menos isso que ta acontecendo aqui, poxa não sei resolver isso eu não queria deixar o usuário sem mensagem na tela.
Alguém pode dar uma olhada no meu código e se possível me dar uma ajuda. Obrigado.

Código que gera o relatório

public String imprimeUnidadeEscolar(UnidadeEscolarRelatorio unidadeEscolarRelatorio) throws JRException, IOException
{
    String strRet = "NAOPASSOU";
    String caminhoRelatorio = FacesContext.getCurrentInstance().getExternalContext().getRealPath(strCaminhoPadrao  + "UnidadeEscolar.jasper");    
	                                      
    File arquivo = new File(caminhoRelatorio);
    InputStream stream = new FileInputStream(arquivo);
    Map<String, Object> params = new HashMap<String, Object>();
    JasperReport  report = (JasperReport) JRLoader.loadObject(stream);
    ArrayList<UnidadeEscolar> lista = new UnidadeEscolarDLO().retUnidadeEscolar(unidadeEscolarRelatorio);
        
    if (lista.size() > 0)
    {
	    JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(lista);
	    JasperPrint print  = JasperFillManager.fillReport(report, params, beanColDataSource);
	        
	    ByteArrayOutputStream baos = new ByteArrayOutputStream();
	    JasperExportManager.exportReportToPdfStream(print, baos);
	        
	    response.reset();
	    response.setContentType("application/pdf; name=\"UnidadeEscolar.pdf\"");
	    response.setContentLength(baos.size());
	    response.setHeader("Content-Disposition", "attachment; filename=UnidadEscolar.pdf");
	    response.getOutputStream().write(baos.toByteArray());
	    response.getOutputStream().flush();
	    response.getOutputStream().close();
	        
	    context.responseComplete();
	    strRet = "PASSOU";
    }
    return strRet;
}    

Metodo que chama a geração do relatório

public void imprimir() throws IOException, JRException
{	
    if (validaSelecaoTela() == "PASSOU")
    {
    	GeraRelatorio relatorio = new GeraRelatorio();
    	String strRet = relatorio.imprimeUnidadeEscolar(this.unidadeEscolarRel);
    	if (strRet.equals("NAOPASSOU"))
    	{
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, "Aviso", "Sem dados para emitir.");

    	    PrimeFaces.current().dialog().showMessageDynamic(message);
	   	}
    }
}

Botão no xHTML

<p:commandButton id = "btnImprimir"
				value = "Imprimir" 
				icon="ui-icon-print"
				ajax="false"
				actionListener="#{unidadeEscolarRelatorioBean.imprimir()}"
				update="@([id$=pnFormCadastro], [id$=message] )">

Essa é a tela certinha

Essa é como fica com ajax = false

Essa é como deveria ficar. Abaixo eu coloco ajax=true fica direito, mas também se os parâmetros retornarem dados na lista o PDF não gera para download. Executa todo o método de geração do pdf, mas nada aparece na tela.

Uma solução que seria um procedimento técnico não homologado (a.k.a. gambiarra) seria você ter o ajax e, ao invés de mandar gerar o relatório, realizar só o select, mas como count. Se retornar 0, apresenta a mensagem, senão, dispara outro evento que, aí sim, gera o relatório, sem o ajax.

darlan_machado, obrigado tirar um pouco do seu tempo para me ajudar, vlw mesmo.

Então, pensei nisso também, mas dai eu entro em outro problema.
Como executar outro evento sem ajax logo após essa consulta com count(*).

Como coloquei na imagem eu não gero uma listagem na tela, o usuário informa os parâmetros e se satisfazer a consulta gera o pdf e o ajax=false ta no botão. Como eu faria para executar esse outro evento???

Se eu bem me lembro, cada botão possui o oncomplete, que invoca alguma ação após a execução completa da action mapeada (e consequente resposta).
Talvez isso ajude.

É isso não da certo não., mas obrigado pela ajuda.

Vou mudar o jeito de imprimir os cadastros. Vou colocar as telas de impressão como consulta com a desculpa de ter uma datatable na tela.
Se a consulta preencher a grade habilita botao de impressão.