Поток линеаризованного PDF из сервлета в браузер (быстрый просмотр в Интернете) - PullRequest
2 голосов
/ 16 сентября 2010

Я запускаю веб-приложение, которое предоставляет сервлет.Этот сервлет открывает файл PDF из сетевой файловой системы и, наконец, передает его запрашивающему браузеру.

Все файлы PDF линеаризуются генератором PDF жизненного цикла Adobe и готовы для быстрого просмотра в Интернете.

К сожалению, быстрый веб-просмотр не работает.Я предполагаю, что это проблема того, как открыть и передать файл в коде Java и настройки информации заголовка ответа.если я разверну тестовый pdf в своем веб-приложении на jboss AS и открою его прямо из браузера по URL, то увеличивается загрузка.

Может ли кто-нибудь мне помочь?

Вот код моегосервлет:

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 ]

1 голос
/ 16 сентября 2010

Посмотрим. Вы хотите отправить файл по частям, верно? Затем вы должны проверить заголовок диапазона (заголовок HTTP) и отправить только байты в этом диапазоне. Я прав?

0 голосов
/ 16 сентября 2010

Я не знаком с функцией «PDF fast web view», но в коде вы сначала полностью читаете файл в буфер, а затем записываете его. Клиент не получит ничего до вызова 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...