Mostrando pdf en jsp

He escrito una página jsp para mostrar los contenidos de pdf, pero termino con códigos ascii en jsp. Quiero mostrar los contenidos de pdf en jsp. ¿Cuál es la parte que me he perdido? Cuando bash escribir el contenido de lectura en pdf, solo se muestran los valores de ascii y no en formato legible

                0) { //System.out.println("size:"+c); outs.write(buf, 0, c); out.write(outs.toString()); } } catch (IOException ioe) { ioe.printStackTrace(System.out); } finally { outs.flush(); outs.close(); in.close(); } %>  

JSP es la herramienta incorrecta para el trabajo de servir una descarga de archivos. JSP está diseñado como una tecnología de visualización con la intención de producir fácilmente resultados HTML con taglibs y EL. Básicamente, con su enfoque JSP, su archivo PDF está repleto de tags , etc. y, por lo tanto, está dañado y no se reconoce como un archivo PDF válido. Esta es, por cierto, una de las razones por las que el uso de scriptlets es una mala práctica . Te ha confundido por completo sobre cómo se supone que funcionan las cosas. En este caso particular, eso es usar una clase Java normal para el trabajo de descarga de archivos.

Deberías usar un servlet en su lugar. Aquí hay un ejemplo de kickoff, suponiendo que Servlet 3.0 y Java 7 están disponibles:

 @WebServlet("/foo.pdf") public class PdfServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { File file = new File("/absolute/path/to/foo.pdf"); response.setHeader("Content-Type", getServletContext().getMimeType(file.getName())); response.setHeader("Content-Length", String.valueOf(file.length())); response.setHeader("Content-Disposition", "inline; filename=\"foo.pdf\""); Files.copy(file.toPath(), response.getOutputStream()); } } 

(si el Servlet 3.0 no está disponible, entonces web.xml en web.xml la manera habitual , si Java 7 no está disponible, entonces use un ciclo de lectura / escritura de la manera habitual )

Solo copie esta clase en su totalidad en su proyecto y abra el archivo PDF deseado con /contextpath/Saba_PhBill.pdf lugar de /contextpath/youroriginal.jsp (después de haberlo organizado en un paquete y haber completado automáticamente las importaciones necesarias en la clase, por supuesto) )

Por ejemplo, en un JSP en el que le gustaría mostrar el PDF en línea:

  Download file.pdf  

(el enlace se entiende como degradación elegante cuando el navegador que se está utilizando no admite la inclusión de contenido de la application/pdf en un documento HTML, es decir, cuando no tiene instalado el complemento Adobe Reader)

Ver también:

  • La forma más simple de servir datos estáticos desde fuera del servidor de aplicaciones en una aplicación web Java
  • Plantilla abstracta para un servlet de recursos estáticos que admite ETags, almacenamiento en caché, etc.

Pude ver múltiples problemas:

  • Hay tags html adicionales en la parte superior e inferior de su JSP. No los quiere allí, solo quiere tener el contenido de PDF en su resultado de respuesta.
  • El código establece el tipo de contenido es varias veces. Probablemente esa no sea la causa raíz; sin embargo, asegúrese de hacerlo solo una vez (configúrelo en application/pdf )
  • En el ciclo while, los datos se escriben primero en el flujo de salida de respuesta, luego se escribe un toString() hacia afuera (que en realidad es una instancia de Writer abierta en el flujo de salida de respuesta, el uno en outs ). Solo use la secuencia de respuesta en el ciclo, como

    while ((c = in.read(buf, 0, buf.length)) > 0) { outs.write(buf, 0, c);
    }

Supongamos que ignoramos por completo los consejos contra el uso de un JSP (y como dice BalusC, hay MEJORES MANERAS), aquí hay un pequeño bodrio feo y vergonzoso que funcionó bien para mí. Ni siquiera establece todos los encabezados correctos, pero aquí va:

 <%@ page import="java.io.File" %><%@ page import="org.apache.commons.io.FileUtils" %><% File pdfFile = (File) request.getAttribute("pdf"); byte[] pdfByteArray = FileUtils.readFileToByteArray(pdfFile); response.setContentType("application/pdf"); response.getOutputStream().write(pdfByteArray); response.getOutputStream().flush(); %> 

Es importante asegurarse de que no haya nuevas líneas (u otro espacio en blanco) fuera de las tags scriptlet.

Me obligaron a hacerlo, ¿está bien?