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

我可以以一种方式更改此操作,即当按下“ 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">

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

不可能直接发送到客户端的打印机,而如果不引入某些代码,这些代码像一个小程序一样在客户端以人为中间的方式运行。

其他提示

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

用例:用户以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()。

希望它能帮助某人。

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

response.setHeader("Content-Disposition", "inline");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top