通过Servlet显示Pdf文档

时间:2013-11-30 07:32:45

标签: java servlets pdf iframe

我想在iframe中显示pdf文档。我已经将iframe的源设置为servlet并将一些参数传递给servlet。

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        String docName = request.getParameter("docName");
        String id = request.getParameter("id");

        if (StringUtils.isNotBlank(id) && StringUtils.isNotBlank(docName)) {
            DocumentService service = DamServiceProvider.PROVIDER.getDocumentService();
            FileInBean fileInBean = new FileInBean();
            fileInBean.setDocName(docName);
            fileInBean.setId(Integer.valueOf(id));
            FileDataBean fileDataBean = service.getFileDataBean(fileInBean);

            if (fileDataBean.getStatusCode() == 0) {
                Map<String, String> headerFieldMap = fileDataBean.getHeaderFieldMap();
                String contentType = headerFieldMap.get("Content-type");
                String contentLength = headerFieldMap.get("Content-Length");
                String contentDisposition = headerFieldMap.get("Content-Disposition");

                byte[] stream = fileDataBean.getStream();
                ByteArrayInputStream inputStream = new ByteArrayInputStream(stream);
                OutputStream outputStream = response.getOutputStream();

                response.reset();
                response.setBufferSize(4096);
                response.setContentLength(Integer.valueOf(contentLength));
                response.setContentType(contentType);
                response.setHeader("Content-Disposition", contentDisposition);

                System.out.println(contentDisposition);
                IOUtils.copy(inputStream, outputStream);

                outputStream.close();
                inputStream.close();
            }
        }
    } catch (Exception ex) {
        Log.error(this, ex.getMessage());
    }
}

现在,在我的页面中,我有一个主从细节界面。主要部分包含一系列pdf文件项的轮播。点击该项目后,我将刷新包含iframe的详细信息视图。

我可以看到servlet被调用。大多数情况下,iframe显示pdf文档。但有时它会显示奇怪的xml结构,其中包含xml标签和一些不可读的输出。请参阅附件图片:

Screenshot

特定文件不会发生这种情况。如果文件显示此输出,稍后如果单击该项,则显示有效的pdf,如果某个项目显示有效的pdf,则稍后如果单击它则显示此类输出。当iframe显示此类型的输出时,我的浏览器会显示该pdf文档可能已损坏的信息。

我已经检查了文件所在的存储库,我发现没有问题。所有这些都是有效的pdf,我可以通过pdf阅读器下载和打开它们。

我无法找到此问题的原因。任何指针都会非常有用。

更新 - 1

我检查了输出。它以%% EOF结尾,并在开头有%PDF。

更新 - 2

我已经在Chrome的网络控制台中检查过,GET主要返回三种类型的内容类型:application / pdf,text / plain,application / octet-stream。

  • application / pdf :显示pdf。
  • text / plain 它显示了我上面提到的内容。
  • application / octet-stream 在Firefox中没有出现,但在Chrome中出现,在这种情况下,它正在打开下载文件窗口。

我在servlet中放置了一个日志,以查看从服务返回的内容类型。对于所有情况,它是 application / pdf

2 个答案:

答案 0 :(得分:1)

我认为这可能是内容类型的问题,您可以使用开发人员工具(在Chrome的网络控制台中)确认浏览器中是否存在此问题。

答案 1 :(得分:0)

尝试这样的事情。

File pdfFile = new File(this.pdfStoreLocation + pdfFileName);
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=" + pdfFileName);
response.setContentLength((int) pdfFile.length());

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(pdfFile));
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());

// byte array declared
byte[] buf = new byte[2048];
boolean eof = false;
while (!eof) {
    int length = bis.read(buf);
    if (length == -1) {
        eof = true;
    }else {
        bos.write(buf, 0, length);
    }
}

try {
     bis.close();
}catch (IOException ex) {
     LOGGER.error("Exception in closing buffered input stream on pdf file->" +   this.pdfStoreLocation + pdfFileName);
}

try {
     bos.flush();
}catch (IOException ex) {
     LOGGER.error("Exception in fliushing buffered output stream on pdf file->"
                            + this.pdfStoreLocation + pdfFileName);
}
bos.close();