简体   繁体   English

使用Java Servlet在浏览器中显示Pdf

[英]Display Pdf in browser using java servlet

I have pdf file in my application. 我的申请中有pdf文件。 I need to display the pdf in browser. 我需要在浏览器中显示pdf。 I am reading the file as a fileInputStream, I need to display the pdf in browser with in my application. 我正在将文件读取为fileInputStream,我需要在浏览器中与我的应用程序一起显示pdf。 But i dont have the pdf path, I have the file stream. 但我没有pdf路径,我有文件流。

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. 我已经使用ajax显示pdf,正在使用call_method()javascript ajax请求方法来调用showPdf操作,在showpdf操作中,只是将pdf文件转换为ByteArrayOutputStream并将结果写入输出流中。 But it showing the below metioned result. 但是它显示了下面提到的结果。

Result in JSP : 结果在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 %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拖车<< 142354f5ebefd65d6aacd33a7cb2b4ab>] / Info 6 0 R / Size 7 >> startxref 707 %% EOF

Please give some suggestion. 请给一些建议。

Javascript ajax: 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: Java方法:

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;
}

You will have to write your InputStream to your response OutputStream as follows: 您将必须将InputStream写入响应OutputStream ,如下所示:

  • Your Content-Disposition will have to be inline . 您的Content-Disposition必须为inline
  • Your Content-Type will have to be application/pdf . 您的Content-Type必须为application/pdf
  • Your Content-Length will be the length (in bytes) of the total data in the InputStream . 您的Content-Length将是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();
    }
}

In your servlet, set the MIME type to the correct one for PDF : application/pdf 在您的servlet中,将MIME类型设置为适用于PDF的正确类型: application/pdf

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM