How to Display a PDF document with a Servlet and JSP?

14,455

Thanks everyone. I managed to solve the issue. My anchor wasn't finding the servlet in the directory. This was the fix below

Before:

<a href="ShowAttach">Open</a>

After:

<a href="../ShowAttach">Open</a>

Thanks.

Share:
14,455
Siya Sosibo
Author by

Siya Sosibo

Passionate about technology and startups.

Updated on June 04, 2022

Comments

  • Siya Sosibo
    Siya Sosibo almost 2 years

    I looking to display a PDF document from a database to a browser, I wish the browser to open it but it's also ok if its prompt for it to be download. I know this question has been asked here and other forums but I'm still not winning with this task.

    I have looked at these: JSP n Servlets Display PDF via JSP n Servlet tutorial

    My current code.

    OBJ/Entity:``

     public class Attach
       {
        private String filename = null;
        private InputStream attach = null;
        private int ContentLength = 0;
    
        public String getFilename() {
    
            return filename;
        }
        public void setFilename(String filename) {
    
            this.filename = filename;
        }
        public InputStream getAttach() {
    
            return attach;
        }
        public void setAttach(InputStream attach) {
    
            this.attach = attach;
        }
    
        public int getContentLength() {
    
            return ContentLength;
        }
        public void setContentLength(int contentLength) {
    
            ContentLength = contentLength;
        }
    
        public Attach() {
    
        }
    
        public Attach(String filename, InputStream attach) {
            this.attach = attach;
            this.filename = filename;
        }
    
    
        }
    

    Method to retrieve PDF from DB:

    public Attach getPDFData(String filename) {
    
        try {
            pstmt = conn.prepareStatement("SELECT * FROM FUNC_AREA WHERE FILE_NME = ?");
            pstmt.setString(1, filename);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                newattach.setFilename(rs.getString(3));
                newattach.setAttach(rs.getBinaryStream(5));
            }
    
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return newattach;
    }
    

    My Servlet:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            showAttach(request, response);
        }
    
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            showAttach(request, response);
        }
    
        public void showAttach(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
             RepoOperations repops = new RepoOperations();
            Attach newattachobj = repops.getPDFData("bond.pdf");
    
            try {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
                int inputStreamLength = 0;
                int length = 0;
                while ((length = newattachobj.getAttach().read(buffer)) > 0) {
                    inputStreamLength += length;
                    baos.write(buffer, 0, length);
                }
    
                if (inputStreamLength > newattachobj.getContentLength()) {
                    newattachobj.setContentLength(inputStreamLength);
                }
    
                if (response instanceof HttpServletResponse) {
                    HttpServletResponse httpResponse = (HttpServletResponse) response;
                    httpResponse.reset();
                    httpResponse.setHeader("Content-Type", "application/pdf");
                    httpResponse.setHeader("Content-Length", String.valueOf(newattachobj.getContentLength()));
                    httpResponse.setHeader("Content-Disposition", "inline; filename=\"" + newattachobj.getFilename() + "\"");
                }
    
                response.getOutputStream().write(baos.toByteArray(), 0, (int)newattachobj.getContentLength());
    
                //finally
                response.getOutputStream().flush();
    
                //clear
                baos = null;
    
                System.out.println(newattachobj.getFilename());
            } finally {
                // TODO Auto-generated catch block
                close(response.getOutputStream());
                close(newattachobj.getAttach());
            }
    
        }
    
        private void close(Closeable resource) throws IOException {
            if (resource != null) {
                resource.close();
            }
        }
    

    JSP:

     <form action="ShowAttach">
        <a href="ShowAttach">click here</a>
        <br/>
        <input type="submit" value="submit" id="submit">
        </form>
    

    I'm looking to have a Hyperlink on the JSP page to open the PDF document. Thank You

    The problem is that when I click the button on the JSP page, it gives me a 404 error.