0

我有一个要求,我必须生成一个 pdf,然后单击“SHOW PDF”按钮,我必须在另一个窗口上显示。我已经能够使用 IText 生成 pdf 并存储在我的机器中。我从需要显示在屏幕上的后端库中获得一个 java.io.File 对象作为我的返回值。有人可以指导我如何做到这一点吗?

我的 xhtml 文件有以下代码片段:

<h:commandLink  action="PdfDisplayRedirect.xhtml" target="_blank">show PDF</h:commandLink>

我的 PdfDisplayRedirect.xhtml 有以下代码:

<p:media value="#{pdfGenerationAction.fileName}" width="100%" height="300px">  
Your browser can't display pdf, <h:outputLink value="InitialExamination33.pdf">click</h:outputLink> to download pdf instead.  

我的支持 bean 有以下代码:

private File initialExaminationFile;
private generateFile(){
     this.initialExaminationFile = backendService.generateFile();
}

单击时,我打开了一个新窗口,但未显示 pdf 文件。相反,我调用命令的屏幕显示在那里。

任何帮助将非常感激。谢谢

4

1 回答 1

2

感谢您的回复,没有回复。我自己找到了一个解决方案,我想发布它,以便那些寻找解决方案的人可以使用它。

我的 xhtml 文件包含一个命令链接

  <p:commandLink actionListener="#{pdfGenerationAction.generatePDF(initialExaminationEMRAction.patientID)}" oncomplete="window.open('PdfDisplayRedirect.xhtml')">broadcast Msg</p:commandLink>

我的 pdfGenerationAction bean 文件有以下几行代码:

FileInputStream fis = new FileInputStream(this.initialExaminationFile);
    //System.out.println(file.exists() + "!!");
    //InputStream in = resource.openStream();
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] buf = new byte[1024];
    try {
        for (int readNum; (readNum = fis.read(buf)) != -1;) {
            bos.write(buf, 0, readNum); //no doubt here is 0
            //Writes len bytes from the specified byte array starting at offset off to this byte array output stream.
            System.out.println("read " + readNum + " bytes,");
        }
        this.reportBytes = buf;
    }

我将文件转换为 bytearraystream 并在我的会话中可用。然后我按照 BalusC 在Unable to show PDF in p:media 中给出的建议,从 Primefaces 中的流式内容生成

于 2013-04-30T16:21:13.000 回答