0

我正在使用这个 primefaces 媒体标签来查看 PDF

<p:media value="#{bean.path}" width="100%" height="600px">    
</p:media>


现在,从该页面中的特定文件夹加载 PDF 文件后,(ViewPDF.xhtml)我想从该文件夹中删除该 PDF 文件。我为此搜索并尝试<f:event>了标签并使用了它type="postAddToView",但它在浏览器中显示 PDf 之前删除了该文件,我想要它在浏览器中加载PDF文件后应该删除。我应该使用什么?
任何帮助将不胜感激

4

1 回答 1

0

PDF 文件在“页面加载后”没有完成下载。它是由一个完全独立的 HTTP 请求下载的,该请求在页面加载后开始。您可以在所需的 URL 模式上映射过滤器并在chain.doFilter()调用后执行该工作。但这有点奇怪。

我了解您正在生成 PDF 报告,该报告仅应在提交时显示。在这种情况下,您应该创建一个单独的 servlet,它根据一些请求参数生成 PDF,并将其直接写入响应输出流而不是文件输出流。最后,让 JSF 为该 servlet 生成正确的 URL,并带有正确的请求参数。

例如

public void submit() {
    // ...

    path = externalContext.getRequestContextPath() + "/pdf"
        + "?foo=" + URLEncoder.encode(foo, "UTF-8")
        + "?bar=" + URLEncoder.encode(bar, "UTF-8")
        + "?baz=" + URLEncoder.encode(baz, "UTF-8");
}

和这样的 servlet(假设您使用 iText 生成 PDF):

@WebServlet("/pdf/*")
public class PdfServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String foo = request.getParameter("foo");
        String bar = request.getParameter("bar");
        String baz = request.getParameter("baz");
        // ...

        response.setContentType("application/pdf");
        PdfWriter.getInstance(document, response.getOutputStream());
        // ...
    }

}

如果您想隐藏请求参数,您也可以通过自动生成/唯一 ID 将它们存储在会话中,并将其作为请求参数传递。

于 2012-12-24T11:57:00.403 回答