gpt4 book ai didi

pdf - 无法以p :media generated from streamed content in Primefaces显示PDF

转载 作者:行者123 更新时间:2023-12-04 05:13:27 27 4
gpt4 key购买 nike

我正在尝试显示在新的浏览器窗口中打开的嵌入式PDF。我有以下情况:

  • 在一些由ajax调用的ActionListen中,我生成PDF内容,将数据放入 session 中,然后发送要执行的Javascript(window.open打开新页面以显示PDF)
  • 在打开的页面上,我只有p:media内有h:body标记,其值指向StreamedContent:


  • 现在,在该页面上未生成我的PDF。在日志中,我可以看到这两行:
    org.primefaces.application.PrimeResourceHandler handleResourceRequest
    SEVERE: Error in streaming dynamic resource. Expression cannot be null

    我开始调试并发现一些问题。

    首先,我在 @PostConstruct bean的 RequestScoped方法中添加了断点。有趣的是,断点达到了两次,而PDF完美显示后,令我感到惊讶的是!

    通过 PrimeResourceHandler进行一些调试后,我发现在某些情况下 ValueExpression是未计算的,实际上它会抛出 NullPointerException,并且在调试时,我再次看到发送了两个请求,第二个请求失败,因为在第一个请求和第二个调用中删除了 dynamicContentIdhandleResourceRequest没有意义。

    通过Firebug,我可以看到两个请求,第一个请求适用于PDF数据,第二个请求也适用于内容类型application/pdf,但为空,大小为0。

    xhtml页面:
    <html>
    <h:head></h:head>
    <h:body>
    <p:media value="#{reportBean.streamedContent}" player="pdf" width="500" height="500"/>
    </h:body>
    </html>

    后备 bean :
    @RequestScoped
    public class StampaListeBackingBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private StreamedContent streamedContent;

    @PostConstruct
    public void init() {
    Map<String, Object> session = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
    byte[] b = (byte[]) session.get("reportBytes");
    if (b != null) {
    streamedContent = new DefaultStreamedContent(new ByteArrayInputStream(b), "application/pdf");
    }
    }

    public StreamedContent getStreamedContent() {
    if (FacesContext.getCurrentInstance().getRenderResponse()) {
    return new DefaultStreamedContent();
    } else {
    return streamedContent;
    }
    }

    public void setStreamedContent(StreamedContent streamedContent) {
    this.streamedContent = streamedContent;
    }
    }

    我需要了解为什么在页面上使用 p:media标记发送了两个请求,并弄清楚了如何使其工作。支持bean是请求范围的,它通过 StreamedContent方法创建 @PostConstruct,并且具有该字段的getter和setter。 Primefaces版本是3.4.2,带有Mojarra 2.1.14。

    已添加:

    重现我的问题很容易。如果将 init方法中的代码替换为以下代码:
    FileInputStream fis = new FileInputStream(new File("C:\\samplexxx.pdf"));
    streamedContent = new DefaultStreamedContent(fis, "application/pdf");

    问题可以重现。

    最佳答案

    我可以重现您的问题。实际上,它在Firefox中也不起作用(在IE9中也不起作用,但在Chrome中有效)。 PrimeFaces负责人Cagatay也提到了several times

    我不确定这是否是PrimeFaces资源处理程序或浏览器中的错误。我将其留在中间。

    同时,最好的选择是为该工作准备一个简单的web servlet。只需创建此类:

    @WebServlet("/report.pdf")
    public class PdfReportServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    byte[] content = (byte[]) request.getSession().getAttribute("reportBytes");
    response.setContentType("application/pdf");
    response.setContentLength(content.length);
    response.getOutputStream().write(content);
    }

    }

    并按如下方式调用它:
    <p:media value="/report.pdf" ... />

    就是这样。无需XML配置。它适用于所有浏览器。根据功能要求,您可能需要进一步优化与浏览器缓存相关的响应头。

    关于pdf - 无法以p :media generated from streamed content in Primefaces显示PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14484555/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com