开发者社区 问答 正文

JSF:仅在准备好文件后,如何在新选项卡上显示PDF文件

服务器正在生成一个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); }

展开
收起
被纵养的懒猫 2019-09-27 19:38:14 435 分享 版权
阿里云 AI 助理回答

要实现您的需求,即仅在PDF文件完全生成后才在新标签页中显示它,您可以通过修改前端JavaScript代码来控制文件的下载时机。这里的关键是确保浏览器只在PDF文件准备好时打开新标签页并加载文件。您可以使用Ajax异步处理PDF生成请求,并在服务器端完成生成后再通知前端。

下面是一个简化的示例,展示了如何结合Ajax调用来实现这一功能:

  1. 修改JSF文件:首先,将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&amp;id=#{yourBean.generatedPDFId}';
        window.open(pdfURL, '_blank');
    } else if (data.status === 'error') {
        alert('Error generating PDF.');
    }
}
</script>
  1. 在Bean中添加逻辑
// 假设您有一个用于存储生成的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的生成与传递、以及如何安全地从服务器端提供下载)会根据您的实际项目架构有所不同。务必确保遵循最佳实践,特别是在处理文件上传和下载的安全性方面。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答标签:
问答地址: