服务器正在生成一个PDF文件,将其显示在客户端浏览器的新选项卡上,但是该选项卡将打开,而尚未创建的文件将显示空白选项卡,直到PDF创建完成。
我希望仅在PDF创建完成后才打开新选项卡。
我的JSF文件
<h:commandLink styleClass="btn btn-primary btn-block" action="#{mybean.generatePDF}" target="_blank" style="margin-left: 0px;"> Show PDF <f:param name="idConsultation" value="#{ophtHistoryBean.consultation.id}" /> </h:commandLink> 我的豆
try { pdfGenerator = new PDFGenerator("PDF file", getOphthalmologicalHistory().getPatient().getCip() .toString(), localeBean.getLocale(), uploadImageBean.getImages()); File file = pdfGenerator.generateConsultationPDF(getOphthalmologicalHistory().getPatient(), getOphthalmologicalHistory()); Faces.sendFile(file, false); } catch (IOException e) { throw new RuntimeException("Error generating PDF", e); }
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
要实现您的需求,即仅在PDF文件完全生成后才在新标签页中显示它,您可以通过修改前端JavaScript代码来控制文件的下载时机。这里的关键是确保浏览器只在PDF文件准备好时打开新标签页并加载文件。您可以使用Ajax异步处理PDF生成请求,并在服务器端完成生成后再通知前端。
下面是一个简化的示例,展示了如何结合Ajax调用来实现这一功能:
<h:commandButton value="Show PDF" action="#{yourBean.generateAndDisplayPDF}">
<f:ajax execute="@form" render="pdfStatus" onevent="handlePDFGenerationComplete"/>
</h:commandButton>
<h:message id="pdfStatus" for="generatePDFAction" style="display:none;"/>
<script>
function handlePDFGenerationComplete(data) {
if (data.status === 'success') {
// 当PDF生成成功后,这里的逻辑会被触发
var pdfURL = '#{request.contextPath}/downloadPDF?faces-redirect=true&id=#{yourBean.generatedPDFId}';
window.open(pdfURL, '_blank');
} else if (data.status === 'error') {
alert('Error generating PDF.');
}
}
</script>
// 假设您有一个用于存储生成的PDF ID的属性
private String generatedPDFId;
public void generateAndDisplayPDF() {
try {
pdfGenerator = new PDFGenerator("PDF file", getOphthalmologicalHistory().getPatient().getCip().toString(), localeBean.getLocale(), uploadImageBean.getImages());
File file = pdfGenerator.generateConsultationPDF(getOphthalmologicalHistory().getPatient(), getOphthalmologicalHistory());
// 保存PDF到临时位置或数据库,并获取其ID(或直接URL)
// 这里假设您有相应的方法来处理文件上传和返回ID
generatedPDFId = savePDFAndReturnId(file);
// 注意:实际应用中可能需要更复杂的错误处理和资源管理
} catch (IOException e) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error generating PDF", null));
}
}
// 提供一个方法或导航案例以根据ID下载PDF
public String downloadPDF() {
// 根据generatedPDFId找到并提供PDF文件的下载
// 这可能涉及到重定向到一个能够发送文件的Servlet或其他处理程序
return "/path/to/downloadPDF.xhtml?pdfId=" + generatedPDFId;
}
请注意,上述代码仅为示例,具体实现细节(如PDF的存储、ID的生成与传递、以及如何安全地从服务器端提供下载)会根据您的实际项目架构有所不同。务必确保遵循最佳实践,特别是在处理文件上传和下载的安全性方面。