Как показать Java (JSF), сгенерированный PDF непосредственно в Adobereader
-
25-09-2019 - |
Вопрос
Я использую JSF 2.0 (Eclipse IDE), и у меня есть метод в одном из моих бобов, которые генерируют некоторые файлы PDF, используя Apache FOP 1.0. Когда я нажимаю кнопку «MakePDF» на моей странице JSF, сгенерированные PDF открываются в том же окне, где моя страница (и я должен использовать кнопку «назад» после того, как я просматривал / Save / Print PDF).
Я могу изменить это таким образом, когда нажата кнопка «MakePDF», появляется стандартное диалоговое окно из всплывания и запрашивает ли я, если я хочу сохранить файл или открыть его с помощью Adobereader.
Есть ли способ, которым, когда я нажимаю кнопку «MakePDF», сгенерированный PDF напрямую открывается в Adobereader (и у меня все еще есть моя страница JSF и не нужно ничего подтверждать) ??? Также (это на самом деле не нужно, но приятно знать), есть ли способ открыть его в новом окне или отправить его прямо на принтер?
Вот главная часть моего кода (я удалил некоторые неактуальные вещи):
public void makePDF(long contractId, int documentType) {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
String basePath = externalContext.getRealPath("/");
try {
fopFactory.setUserConfig(new File(basePath + "/pdf_transform/config/userconfig.xml"));
fopFactory.setBaseURL(basePath);
fopFactory.getFontManager().setFontBaseURL(basePath);
} catch (Exception e) {
e.printStackTrace();
}
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
foUserAgent.setBaseURL(fopFactory.getBaseURL());
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
response.reset();
response.setHeader("Content-Type", "application/pdf");
response.setHeader("Content-disposition", "attachment");
BufferedOutputStream output = null;
try {
output = new BufferedOutputStream(response.getOutputStream(), 10240);
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource(xsltfile));
Source src = new DOMSource(makeXML(contract)); // my method
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
} catch (Exception e) {
e.printStackTrace();
}
facesContext.responseComplete();
}`
Когда я удаляю response.setHeader("Content-disposition", "attachment");
Он открывается в том же окне, в противном случае он просит меня сохранить или открывать.
Заранее спасибо.
Решение
Открытие запроса в новом окне не является проблемой JSF. Это больше концерна HTML.
Добавлять target="_blank"
к форме
<h:form target="_blank">
И это будет представить запрос на новую вкладку / окно.
Отправка на принтер клиента напрямую невозможно без внедрения какого-либо куска кода, который работает на стороне клиента в качестве человека в середине, как апплет.
Другие советы
У меня была похожая проблема, и к счастью, нашел элегантный способ решить это. Если у кого-то лучшее решение, пожалуйста, дайте мне знать.
Используйте Case: Пользователь вводит данные в сгенерированной JSF, необходимой для создания PDF (PDF генерируется с сервлета). Если валидация не удается, сообщения об ошибках отображаются, но если все идет Fine PDF-файл, открывается в новом окне. :-)
Мое решение:
В шаблоне .xhtml (или сайт, который определяет Facelets) введите:
<ui:define name="head"> <h:outputScript rendered="#{myBean.pdfDownloadable}"> window.open('#{myBean.pdfUrl}',"pdfWindow","width=800,height=900,left=50,top=10") </h:outputScript> </ui:define>
Ваша командная ссылка в JSF-форме указывает на метод действий в MyBean (например, mybean.showpdf ())
- Если данные формы действительны, и ShowPDF () называется, вы можете установить PDFDownloadable поле в True, и тот же результат снова отображается, но на этот раз с окном .Open () в нем.
Надеюсь, это поможет кому-то ..
Если вы хотите открыть PDF напрямую, пожалуйста, используйте
response.setHeader("Content-Disposition", "inline");