Как показать сгенерированный java (jsf) pdf прямо в AdobeReader - PullRequest
1 голос
/ 10 декабря 2010

Я использую JSF 2.0 (Eclipse IDE), и у меня есть метод в одном из моих компонентов, который генерирует некоторые PDF-файлы с использованием Apache FOP 1.0.Когда я нажимаю кнопку «makePDF» на моей странице JSF, сгенерированный PDF открывается в том же окне, где находится моя страница (и мне приходится использовать кнопку «назад» после просмотра / сохранения / печати 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");, он открывается в том же окне, в противном случае он просит меня сохранить или открыть.

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

Ответы [ 3 ]

2 голосов
/ 03 марта 2011

, если вы хотите открыть PDF-файл напрямую, используйте

response.setHeader("Content-Disposition", "inline");
2 голосов
/ 31 мая 2012

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

Вариант использования: пользователь вводит данные в форме, сгенерированной 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. Если данные формы верны и вызывается showPdf (), вы можете установить для поля pdfDownloadable значение true, и тот же результат будет обработан снова, но на этот раз с window.open ().

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

2 голосов
/ 10 декабря 2010

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

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

<h:form target="_blank">

и запрос будет отправлен в новую вкладку / окно.

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

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