7
votes

I have pdf file in my application. I need to display the pdf in browser. I am reading the file as a fileInputStream, I need to display the pdf in browser with in my application. But i dont have the pdf path, I have the file stream.

Please give me some suggestion and examples


I have used ajax to display the pdf, I am using the call_method() javascript ajax request method to call the showPdf action, In showpdf action just converting the pdf file as ByteArrayOutputStream and write the result in the out put stream. But it showing the below metioned result.

Result in JSP:

%PDF-1.4 %��� 1 endstream endobj 4 0 obj <>>>/MediaBox[0 0 595 842]>> endobj 1 0 obj <> endobj 3 0 obj <> endobj 5 0 obj <> endobj 6 0 obj <> endobj xref 0 7 0000000000 65535 f 0000000389 00000 n 0000000015 00000 n 0000000477 00000 n 0000000232 00000 n 0000000540 00000 n 0000000585 00000 n trailer <<142354f5ebefd65d6aacd33a7cb2b4ab>]/Info 6 0 R/Size 7>> startxref 707 %%EOF

Please give some suggestion.

Javascript ajax:

call_method(); <br/>
function call_method(){

    Ext.Ajax.request({
            waitMsg: 'Saving changes...',
            url:'test.action?method=showPdf',
            params : { },       
            failure:function(response,options){

            },
            success:function(response,options){
                $("#pdf_content").show();               
                $("#pdf_content").html(response.responseText);
                $("#pdf_content").show('slow');
            }
    });
}

Java Methods:

public String showPdf() throws IOException {

    getResponse().setContentType("application/pdf");

    getResponse().setHeader("Content-disposition","inline; filename=automatic_start.pdf" );


    ByteArrayOutputStream baos = getByteArrayOutputStream();

    getResponse().setContentLength(baos.size());

    ServletOutputStream sos;

    sos = getResponse().getOutputStream();

    baos.writeTo(sos);

    sos.flush();

    return null;
}


private ByteArrayOutputStream getByteArrayOutputStream() throws IOException {

    String filePath = "/homefolder/";

    String folderPath=filePath+"1122/automatic_start.pdf";

    File file = new File(folderPath);

    FileInputStream fis = new FileInputStream(file);



    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] buf = new byte[256];
     try {
            for (int readNum; (readNum = fis.read(buf)) != -1;) {
                bos.write(buf, 0, readNum); //no doubt here is 0
                //Writes len bytes from the specified byte array starting at offset off to this byte array output stream.
                System.out.println("read " + readNum + " bytes,");
            }

        } catch (IOException ex) {
            ex.printStackTrace();
        }


    return bos;
}
2
i have the same problem, but didn't get the solution. Plz, help me. What should i change in the jsp page. Need help.!!user918477
I had same issue... but for me it was because i didn't include the response.setHeader("Content-disposition","inline; filename=automatic_start.pdf" ); Since I didn't have an actual filename to Download (since the pdf was served by what is 'in memory'), then i thought i didn't need to have a filename in there. IE seems to need it otherwise it showed that gibberish you mentioned '%PDF-1.4 % ...' in the browser. Plus its useful so if its inline, and user decides to save, it defaults at that name i believe. PS Could also use "attachment; ..." instead of "inline; ...".armyofda12mnkeys

2 Answers

9
votes

You will have to write your InputStream to your response OutputStream as follows:

  • Your Content-Disposition will have to be inline.
  • Your Content-Type will have to be application/pdf.
  • Your Content-Length will be the length (in bytes) of the total data in the InputStream.

Once set, write the input stream data to output stream of the response.

Something of this effect:

/* (non-Javadoc)
 * @see org.bfs.bayweb.util.renderer.ServletViewRenderer#render(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
 */
public void render(ServletRequest request, ServletResponse response) throws IOException {
    // TODO Auto-generated method stub
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
        int inputStreamLength = 0;
        int length = 0;
        while ((length = getInputStream().read(buffer)) > 0) {
            inputStreamLength += length;
            baos.write(buffer, 0, length);
        }

        if (inputStreamLength > getContentLength()) {
            setContentLength(inputStreamLength);
        }

        if (response instanceof HttpServletResponse) {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            httpResponse.reset();
            httpResponse.setHeader("Content-Type", getContentType());
            httpResponse.setHeader("Content-Length", String.valueOf(getContentLength()));
            httpResponse.setHeader("Content-Disposition", "\"" + getContentDisposition() + "\"" + ((getFileName() != null && !getFileName().isEmpty()) ? "; filename=\"" + getFileName() + "\"": ""));
        }

        response.getOutputStream().write(baos.toByteArray(), 0, (int)getContentLength());

        //finally
        response.getOutputStream().flush();

        //clear
        baos = null;
    } finally {
        // TODO Auto-generated catch block
        close(response.getOutputStream());
        close(getInputStream());
    }
}

private void close(Closeable resource) throws IOException {
    if (resource != null) {
        resource.close();
    }
}
5
votes

In your servlet, set the MIME type to the correct one for PDF : application/pdf

See http://www.iana.org/assignments/media-types/