2010-12-10 3 views
1

Я использую 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"); он открывается в том же окне, в противном случае он просит меня, чтобы сохранить или открытым.

Заранее спасибо.

ответ

2

Открытие запроса в новом окне напрямую не относится к JSF. Это больше беспокоит HTML.

Добавить target="_blank" в форму

<h:form target="_blank"> 

, и он будет подавать заявку в новой вкладке/окне.

Отправка на принтер клиента напрямую невозможна без введения части кода, которая работает на стороне клиента как человек посередине, как апплет.

+0

Спасибо, я пропустил это в своей статье по обработке PDF, потому что я сосредоточился только на Java-коде :). Тем не менее, это не отвечает на мой главный вопрос, то есть я могу открыть его непосредственно в AdobeReader (не в окне), или у меня есть изменить мой подход? – Nikola 2010-12-11 23:28:48

2

, если вы хотите, чтобы открыть PDF непосредственно, пожалуйста используйте

response.setHeader("Content-Disposition", "inline"); 
2

У меня была аналогичная проблема, и, к счастью, нашли элегантный способ решить эту проблему. Если у кого-то есть лучшее решение, пожалуйста, дайте мне знать.

Использование: Пользователь вводит данные в форме, сгенерированной JSF, необходимой для создания PDF (PDF создается из сервлета). Если проверка не пройдена, сообщения об ошибках визуализируются, но если все идет нормально открывает файл PDF в новом окне :-)

Мое решение:.

  1. В template.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> 
    
  2. Ваша команда ссылки в точках JSF-формы для метода действия в myBean, а также (например, myBean.showPdf())

  3. Если данные формы являются действительными и showP Вызывается df(), вы можете установить для поля pdfDownloadable значение true, и тот же результат снова отображается, но на этот раз с помощью window.open().

Надеюсь, это поможет кому-то ..

Смежные вопросы