iText 生成的 PDF 在 Chrome 中无法正确显示

发布于 2024-11-09 04:55:13 字数 2666 浏览 0 评论 0原文

我正在使用 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

I am using the iText library in Java to generate a pdf file. The idea is that a user fills in some information and that when the user clicks on the generate button the pdf is shown in a new tab in the browser. Now I have stumbled upon some problems doing this, which are :
- the URL does not change, so instead of /application/user.pdf I get /application/dashboard.xhtml
- I can save the pdf file in all browsers except for Chrome.

Please note that I don't want to save it on disc but simply show the pdf in the browser so the user can choose if he wants to save it.

Here is the code that I use to generate my 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.
    }
}

*This method is behind a button on my JSF page *

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;
}

Used technologies :
- JSF 2.0
- Facelets
- iText

Thanks in advance :D

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

执笔绘流年 2024-11-16 04:55:13

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

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

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

The way that I have achieved this in the past is by creating a seperate Servlet to serve PDF documents directly. In the web.xml file you would specify the servlet mapping to *.pdf.

What you can do then is rather than override the FacesServlet response bytes to server the PDF file you just redirect the response to filename.pdf, passing needed parameters in the URL.

Your PDF servlet can actually do the work of building the necessary PDF, it will open in a seperate tab and the URL will match the response redirect.

缘字诀 2024-11-16 04:55:13

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

Does chrome open the PDF and then not render it correctly? In that case, please open an issue at http://new.crbug.com and attach an example PDF file that shows the problem. Reply with the issue number here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文