【问题标题】:iText generated PDF not shown correctly in ChromeiText 生成的 PDF 在 Chrome 中未正确显示
【发布时间】:2025-12-23 13:05:16
【问题描述】:

我正在使用 Java 中的 iText 库来生成 pdf 文件。这个想法是用户填写一些信息,当用户单击生成按钮时,pdf 将显示在浏览器的新选项卡中。现在我偶然发现了一些这样做的问题,它们是: - URL 没有改变,所以我得到 /application/dashboard.xhtml 而不是 /application/user.pdf - 我可以在除 Chrome 之外的所有浏览器中保存 pdf 文件。

请注意,我不想将其保存在光盘上,而只是在浏览器中显示 pdf,以便用户选择是否要保存。

这是我用来生成我的 pdf 的代码:

     public static void createPdf(User user, byte languageNumber, HttpServletResponse   response) {
Document document = new Document();
    try {
        /*    PdfWriter writer = PdfWriter.getInstance(document,
 new FileOutputStream("c://" + user.getUsername() + "_" + languageCode + ".pdf"));*/
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter.getInstance(document, baos);
        document.addTitle("Your CV");
        document.addSubject("This is your CV");
        document.addKeywords("CV");
        document.addAuthor(user.getUsername());
        document.open();
        document.add(
                new Paragraph(user.getPersonalInformation().getFirstname() + " " +    user.getPersonalInformation().getLastname()));
        document.close();
        // setting some response headers
        response.setHeader("Expires", "0");
        response.setHeader("Cache-Control",
            "must-revalidate, post-check=0, pre-check=0");
        response.setHeader("Pragma", "public");
        // setting the content type
        response.setContentType("application/pdf");
        response.setContentLength(baos.size());
        //ServletOutputStream out = response.getOutputStream();
        OutputStream out = response.getOutputStream();
        baos.writeTo(out);
        out.flush();
        out.close();
    } catch (DocumentException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }
}

*这个方法在我的 JSF 页面上的一个按钮后面 *

public String exportPdf() {
    user = userService.retrieveLoginUser();
    FacesContext context = FacesContext.getCurrentInstance();
    try {
        Object response = context.getExternalContext().getResponse();
        if (response instanceof HttpServletResponse) {
            HttpServletResponse hsr = (HttpServletResponse) response;
            PdfCreator.createPdf(user, selectLanguage, hsr);
            //Tell JSF to skip the remaining phases of the lifecycle
            context.responseComplete();
        }
        return "../" + user.getUsername() + ".pdf";
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

使用的技术: - JSF 2.0 - 小面 - iText

提前致谢:D

【问题讨论】:

  • 可能需要您设置 MIME 内容? “应用程序/pdf”,如果我没记错的话……
  • 你设置了 content-disposition: inline 吗?

标签: java jsf google-chrome itext


【解决方案1】:

我过去实现这一点的方法是创建一个单独的 Servlet 来直接提供 PDF 文档。在 web.xml 文件中,您可以指定映射到 *.pdf 的 servlet。

然后您可以做的不是覆盖 FacesServlet 响应字节来服务器 PDF 文件,您只需将响应重定向到 filename.pdf,在 URL 中传递所需的参数。

您的 PDF servlet 实际上可以完成构建必要 PDF 的工作,它将在单独的选项卡中打开,并且 URL 将匹配响应重定向。

【讨论】:

    【解决方案2】:

    chrome 会打开 PDF,然后无法正确呈现它吗?在这种情况下,请在http://new.crbug.com 打开一个问题并附上一个显示问题的示例 PDF 文件。在此处回复问题编号。

    【讨论】: