将线性化的PDF从servlet流式传输到浏览器(快速Web视图)

时间:2010-09-16 08:00:42

标签: java pdf servlets streaming linearization

我正在运行一个提供servlet的Web应用程序。此servlet从网络文件系统打开pdf文件,最后将其流式传输到请求的浏览器。

所有pdf文件均由adobe生命周期pdf生成器线性化,可以快速查看网页。

不幸的是,快速Web视图不起作用。我想这是如何在java代码中打开和流式传输文件以及响应头信息的设置的问题。 如果我在我的webapp中将测试pdf部署到jboss AS上并通过url直接从浏览器打开它,则增量加载工作正常。

任何人都可以帮助我吗?

这是我的servlet的代码:

response.setContentType("application/pdf");
response.setHeader("Expires", "0");
response.setHeader("Cache-Control",
    "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Content-Disposition",
    "inline;filename=" + documentReference);
response.setHeader("Accept-Ranges", "bytes");

File nfsPDF = new File(NFS_DIRECTORY_PATH + documentReference);

FileInputStream fis = new FileInputStream(nfsPDF);
BufferedInputStream bis = new BufferedInputStream(fis);
ServletOutputStream sos = response.getOutputStream();
byte[] buffer = new byte[(int) nfsPDF.length()];
while (true) {
   int bytesRead = bis.read(buffer, 0, buffer.length);
   if (bytesRead < 0) {
      break;
   }
   sos.write(buffer, 0, bytesRead);
}
sos.flush();
//... closing...

2 个答案:

答案 0 :(得分:1)

我们来看看。你想发送部分文件,对吧?然后,您应该检查Range标头(HTTP标头)并仅发送此范围内的字节。我没错?

答案 1 :(得分:0)

我不熟悉“PDF快速网络视图”功能,但是在您的代码中,您首先将文件完全读入缓冲区,然后将其写出来。在调用sos.flush()之前,客户端不会收到任何内容。实际上你的while循环已经过时了,因为总会有一次运行。

也许你应该尝试以块状方式读/写这些东西。

byte[] buffer = new byte[1024];
while (true) {
   int bytesRead = bis.read(buffer, 0, buffer.length);
   if (bytesRead < 0) {
      break;
   }
   sos.write(buffer, 0, bytesRead);
   sos.flush();
}

sos.flush();