【问题标题】:How to show java (jsf) generated pdf directly in AdobeReader如何在 Adob​​e Reader 中显示 java (jsf) 直接生成 pdf
【发布时间】:2010-12-10 00:14:29
【问题描述】:

我正在使用 JSF 2.0 (Eclipse IDE),我的一个 bean 中有一个方法,它使用 Apache FOP 1.0 生成一些 PDF 文件。当我在我的 JSF 页面上单击“makePDF”按钮时,生成的 PDF 会在我的页面所在的相同窗口中打开(并且在查看/保存/打印 PDF 后我必须使用“返回”按钮)。

我可以改变这种方式,当按下“makePDF”按钮时,会出现标准弹出对话框并询问我是否希望保存文件或使用 Adob​​eReader 打开它。

有没有一种方法,当我单击“makePDF”按钮时,生成的 PDF 会直接在 Adob​​eReader 中打开(我仍然有我的 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 pdf-generation jsf-2 acrobat apache-fop


    【解决方案1】:

    在新窗口中打开请求并不是 JSF 的直接关注点。这更像是一个 HTML 问题。

    在表单中添加target="_blank"

    <h:form target="_blank">
    

    它会将请求提交到新的选项卡/窗口中。

    如果不引入一些在客户端作为中间人运行的代码,例如小程序,就无法直接发送到客户端的打印机。

    【讨论】:

    • 谢谢,我在您的 PDF 处理文章中错过了这一点,因为我只专注于 java 代码 :) 不过,这并不能回答我的主要问题,即我可以直接在 Adob​​eReader 中打开它(而不是在窗口)还是我必须改变我的方法?
    • 这是您无法控制的浏览器设置。例如,在 Firefox 中,检查 工具 > 选项 > 应用程序。
    • 不知道,谢谢。虽然事实证明它并不是真正与 jsf/fop 相关,但它解决了我的问题。
    【解决方案2】:

    我遇到了类似的问题,幸运的是找到了一种优雅的方法来解决它。如果有人有更好的解决方案,请告诉我。

    用例: 用户在创建 PDF 所需的 JSF 生成表单中输入数据(PDF 是从 servlet 生成的)。如果验证失败,则会呈现错误消息,但如果一切正常,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()。

    希望对某人有所帮助..

    【讨论】:

      【解决方案3】:

      如果您想直接打开 PDF,请使用

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

      【讨论】:

        猜你喜欢
        • 2018-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 2012-04-29
        • 1970-01-01
        相关资源
        最近更新 更多