Я использую JSF 2.0 (Eclipse IDE), и у меня есть метод в одном из моих компонентов, который генерирует некоторые файлы PDF, используя Apache FOP 1.0. Когда я нажимаю кнопку «makePDF» на моей странице JSF, сгенерированный PDF открывается в окне SAME, где находится моя страница (и мне нужно использовать кнопку «назад» после того, как я просмотрю/сохранил/распечатаю PDF).Как показать java (jsf) сгенерированный PDF непосредственно в AdobeReader
Я могу изменить это так, чтобы при нажатии кнопки «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");
он открывается в том же окне, в противном случае он просит меня, чтобы сохранить или открытым.
Заранее спасибо.
Спасибо, я пропустил это в своей статье по обработке PDF, потому что я сосредоточился только на Java-коде :). Тем не менее, это не отвечает на мой главный вопрос, то есть я могу открыть его непосредственно в AdobeReader (не в окне), или у меня есть изменить мой подход? – Nikola 2010-12-11 23:28:48