【发布时间】: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