1

我正在使用 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");它时,它会在同一个窗口中打开,否则它会要求我保存或打开。

提前致谢。

4

3 回答 3

2

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

response.setHeader("Content-Disposition", "inline");
于 2011-03-03T02:31:59.317 回答
2

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

添加target="_blank"到表单

<h:form target="_blank">

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

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

于 2010-12-10T01:59:33.393 回答
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()。

希望它可以帮助某人..

于 2012-05-31T07:54:30.727 回答