Как показать Java (JSF), сгенерированный PDF непосредственно в Adobereader

StackOverflow https://stackoverflow.com/questions/4404496

Вопрос

Я использую 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-файл, открывается в новом окне. :-)

Мое решение:

  1. В шаблоне .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, и тот же результат снова отображается, но на этот раз с окном .Open () в нем.

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

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

response.setHeader("Content-Disposition", "inline");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top