iText生成的PDF在Chrome中无法正确显示
我在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 – Facelets – iText
提前致谢
我过去实现这一目标的方法是创建一个单独的Servlet来直接提供PDF文档。 在web.xml文件中,您将指定servlet映射到*.pdf
。
你可以做的不是覆盖FacesServlet响应字节来服务PDF文件,你只需将响应重定向到filename.pdf
,在URL中传递所需的参数。
您的PDF servlet实际上可以完成构建必要PDF的工作,它将在单独的选项卡中打开,URL将与响应重定向匹配。
chrome是否打开PDF然后无法正确呈现? 在这种情况下,请在http://new.crbug.com上打开一个问题,并附上一个显示问题的示例PDF文件。 在这里回复问题编号。
- 哪个ChromeDriver版本与哪个Chrome浏览器版本兼容?
- 使用ChromeDriver和无头模式下载Java,Selenium中的文件
- ChromeDriver:自定义Chrome可执行文件路径
- JTabbedPane:标签本身之前和之后的组件
- 是否已弃用使用浏览器在Chrome中实时查看EventSource?
- 我可以从Java应用程序中删除下载的JNLP文件(Java Web start / JWS)吗?
- Selenium 2 chrome驱动程序首选项java相当于RubyBindings
- org.openqa.selenium.WebDriverException:chrome无法访问 – 尝试启动新会话时
- Chrome错误:您使用的是不受支持的命令行标志: – ignore-certifcate-errors。 稳定性和安全性将受到影响