Geração de relatório e redirect em um mesmo <h:commandLink>

Bom dia pessoal, tudo bem? Venho encontrando problemas ao tentar executar determinada ação em meu sistema.

Tenho um h:commandLink que sua ação (atributo “action”) consiste em efetuar a liquidação de um título. Surgiu, porém, a necessidade de se gerar um recibo de pagamento nesta mesma ação. Para isso, foi adicionado um campo na tela chamado “Gerar recibo” com as opções “Sim/Não”. Sendo assim, o comportamento esperado é de que ao clicar neste commandLink, seja efetuada a baixa, download do recibo e redirect para a página anterior.

A implementação está funcionando até o ponto do redirect. Consigo processar a liquidação, disponibilizo o recibo, porém não consigo voltar para a tela anterior. Imagino que seja devido à forma como estou disponibilizando o relatório gerado, como segue:

FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=" + "Recibo.pdf");

OutputStream out = response.getOutputStream();

ReciboPrinter printer = new ReciboPrinter(tos, out, true);
printer.execute();

Como podem ver, a disponibilização do arquivo PDF manipula a resposta da requisição, encerrando-a neste ponto. A partir daí, qualquer tentativa de redirecionamento apresenta a mensagem:

getOutputStream() has already been called for this response

Alguma ideia de como eu possa resolver este problema?

Obrigado.

Você pode tentar gerar o relatório numa nova janela e na janela anterior realizar o redirect.

Você diz como popup ou nova aba?
Se for em nova aba eu já tentei fazer e ocorre o mesmo problema. Gera o relatório normalmente na nova aba, porém na outra continua preso na página.
Como popup também já pensei porém só posso abri-lo ao final da requisição (pois a geração do recibo é dependente do sucesso da baixa do título) e o commandLink não provê este recurso, já que ele submete o formulário inteiro e não possui o atributo “oncomplete” ou semelhante. Eu só poderia abrir o popup no “onClick” do botão mas nesse momento ainda não sei se a liquidação será efetuada com sucesso.