JSF Streaming PDF на устройствах iOS - PullRequest
       0

JSF Streaming PDF на устройствах iOS

1 голос
/ 28 сентября 2011

У меня есть страница JSF, которая использует вспомогательный компонент для потоковой передачи PDF-документа в браузер.Эта функциональность прекрасно работает, и до сих пор у меня не было проблем с ней при тестировании этой функции на устройствах iOS.

В Safari как на iPad, так и на iPod Touch поток PDF в конечном итоге просто вставляется в слой без прокрутки на веб-странице, когда он получает ответ.В браузерах на рабочем столе файл предлагает сохранить или открыть файл и открывается правильно с помощью Adobe Reader.Это проблема, потому что только часть первой страницы PDF отображается на устройствах iOS и нет возможности просматривать другие части.

Я тестировал другие PDF-файлы на этих устройствах из Интернета, и они не ведут себя одинаково.Либо приложение PDF запускается, либо Safari загружает предварительный просмотр с прокруткой, который является желаемым результатом.У кого-нибудь еще было это?

Мой компонент поддержки записывает буферизованный входной поток PDF в выходной поток.Я установил следующие заголовки ответа:

response.setContentType ("application/pdf"); 
response.setContentLength(inputLength); 
response.setHeader ("Content-Disposition", "inline;filename=\"" + saveFilename + ".pdf\""); 
response.setHeader ("Cache-Control", "must-revalidate, post-check=0, pre-check=0, public"); 

Я попытался переключить расположение содержимого со встроенного на вложение, но это не помогло.

1 Ответ

0 голосов
/ 28 сентября 2011

Я полагаю, что эти устройства требуют поддержки Range на стороне сервера, чтобы контент можно было запрашивать отдельными частями.В конечном итоге это экономит ненужную пропускную способность сети и улучшает ощущение производительности на стороне клиента.

Если эти PDF-файлы генерируются динамически, то лучше всего записать их во временную папку в файловой системе диска и перенаправитьзапрос URL, который читает их с помощью сервлета.Наличие физического файла является обязательным, поскольку вы хотите использовать RandomAccessFile, чтобы иметь возможность вернуть частичное содержимое файла.Для этого класса требуется физический File на диске.

Вот пример, который использует File#createTempFile() для создания временного файла и перенаправляет ответ сервлету симя файла в качестве параметра URL:

File tempFile = File.createTempFile(saveFilename, ".pdf");
OutputStream output = new FileOutputStream(tempFile);
// Now write PDF to output.
// ...

// Then, redirect to some servlet URL.
String tempFilename = tempFile.getName();
externalContext.redirect("/pdf/" + URLEncoder.encode(tempFilename, "UTF-8"));

Затем вам нужно иметь сервлет, подобный , этот , который поддерживает запросы диапазона.Вам нужно только изменить его, чтобы изменить значение basePath на System.getProperty("java.io.tmpdir").Наконец, сопоставьте этот сервлет с шаблоном URL-адреса /pdf/*.

В качестве альтернативы, если у вас есть полный административный контроль над сервером, вы также можете создать дополнительный контекст веб-приложения, указывающий на абсолютный путь где-то на диске сервера.файловая система.Например, /var/webapp/pdf.В случае, например, Tomcat, вы можете сделать это общедоступным, добавив следующее к /conf/server.xml:

<Context docBase="/var/webapp/pdf" path="/pdf" />

Таким образом, содержимое папки /var/webapp/pdf доступно для http://localhost:8080/context/pdf.

С незначительным изменением в приведенном выше примере кода для указания местоположения временного файла,

File tempFile = File.createTempFile(saveFilename, ".pdf", "/var/webapp/pdf");
// ...

вам больше не нужен пользовательский сервлет.Tomcat DefaultServlet выполнит работу по правильной обработке Range запросов.

И последнее, но не менее важное, рассмотрите возможность хранения временного файла в сеансе и реализации HttpSessionListener или HttpSessionAttributeListener, который удаляет временный файл после окончания сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...