Como enviar byte como pdf para navegador no aplicativo da web java?

No método de ação (JSF) eu tenho algo como abaixo:

public String getFile() { byte[] pdfData = ... // how to return byte[] as file to web browser user ? } 

Como enviar byte [] como pdf para o navegador?

No método de ação, você pode obter a resposta do servlet HTTP sob os capítulos do JSF por ExternalContext#getResponse() . Então você precisa definir pelo menos o header HTTP Content-Type para application/pdf e o header HTTP Content-Disposition para o attachment (quando você quer abrir um diálogo Save As ) ou para inline (quando você quer deixar o webbrowser lidar com o exibir em si). Finalmente, você precisa garantir que você chame FacesContext#responseComplete() depois para evitar que o IllegalStateException voe.

Exemplo de pontapé inicial:

 public void download() throws IOException { // Prepare. byte[] pdfData = getItSomehow(); FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); HttpServletResponse response = (HttpServletResponse) externalContext.getResponse(); // Initialize response. response.reset(); // Some JSF component library or some Filter might have set some headers in the buffer beforehand. We want to get rid of them, else it may collide. response.setContentType("application/pdf"); // Check http://www.iana.org/assignments/media-types for all types. Use if necessary ServletContext#getMimeType() for auto-detection based on filename. response.setHeader("Content-disposition", "attachment; filename=\"name.pdf\""); // The Save As popup magic is done here. You can give it any filename you want, this only won't work in MSIE, it will use current request URL as filename instead. // Write file to response. OutputStream output = response.getOutputStream(); output.write(pdfData); output.close(); // Inform JSF to not take the response in hands. facesContext.responseComplete(); // Important! Else JSF will attempt to render the response which obviously will fail since it's already written with a file and closed. } 

Dito isso, se você tiver a possibilidade de obter o conteúdo em PDF como um InputStream vez de um byte[] , eu recomendaria usá-lo para salvar o webapp de hogs de memory. Você, então, apenas escreve no loop InputStreamOutputStream bem conhecido da forma usual do Java IO.

Você apenas tem que definir o tipo MIME para application/x-pdf em sua resposta. Você pode usar o método setContentType (String contentType) para fazer isso no caso de servlet.
No JSF / JSP você pode usar isso antes de escrever sua resposta:

 <%@ page contentType="application/x-pdf" %> 

e response.write(yourPDFDataAsBytes()); para escrever seus dados.
Mas eu realmente aconselho você a usar servlets neste caso. O JSF é usado para renderizar exibições HTML, não PDF ou arquivos binários.

Com servlets você pode usar isto:

 public MyPdfServlet extends HttpServlet { protected doGet(HttpServletRequest req, HttpServletResponse resp){ OutputStream os = resp.getOutputStream(); resp.setContentType("Application/x-pdf"); os.write(yourMethodToGetPdfAsByteArray()); } } 

Recursos :

  • mimeapplication.net – pdf
  • Javadoc – ServletResponse
  • Javadoc – HttpServlet

Ao enviar dados brutos para o navegador usando o JSF, você precisa extrair o HttpServletResponse do FacesContext .

Usando o HttpServletResponse , você pode enviar dados brutos para o navegador usando a API de E / S padrão.

Aqui está um exemplo de código:

 public String getFile() { byte[] pdfData = ... FacesContext context = FacesContext.getCurrentInstance(); HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse(); OutputStream out = response.getOutputStream(); // Send data to out (ie, out.write(pdfData)). } 

Além disso, aqui estão algumas outras coisas que você pode querer considerar:

  • Defina o tipo de conteúdo no HttpServletResponse para informar ao navegador que você está enviando dados PDF: response.setContentType (“application / pdf”);
  • Informe ao FacesContext que você enviou dados diretamente para o usuário, usando o método context.responseComplete (). Isso impede que o JSF execute processamento adicional desnecessário.