Jsf 2 使用流式打印机

Jsf 2 使用流式打印机,jsf-2,primefaces,Jsf 2,Primefaces,我正在从Richfaces迁移到Primefaces。在我现有的应用程序中,我有一个打印用例,当用户单击打印按钮时,打印机bean将pdf(以及打印Javascript)内容写入outputstream,并且在客户端自动打开包含pdf内容的打印对话框。对于Richfaces,我使用了以下代码段: <a4j:mediaOutput element="object" type="application/pdf" mimeType="application/pdf" cr

我正在从Richfaces迁移到Primefaces。在我现有的应用程序中,我有一个打印用例,当用户单击打印按钮时,打印机bean将pdf(以及打印Javascript)内容写入outputstream,并且在客户端自动打开包含pdf内容的打印对话框。对于Richfaces,我使用了以下代码段:

<a4j:mediaOutput element="object" type="application/pdf" mimeType="application/pdf"
            createContent="#{printerBean.generatePrintOutput}" value="#{dataBean.printObject}"
            style="width: 0px; height: 0px;" cacheable="false"
            classid="CLSID:CA8A9780-280D-11CF-A24D-444553540000"/>


上述方法适用于richfaces,我想用primefaces实现同样的效果,但找不到确切的替代方法。上面的createContent属性发挥了神奇的作用。将outputstream和printObject传递给我的printerBean.generatePrintOutput方法。请帮助我如何使用primefaces实现这一点。

查看此代码示例:

视图

<h:form id="mainForm">

    <p:commandButton value="Generate" action="#{mediaBean.generatePrintOutput}" update="read" />

    <p:outputPanel id="read">
        <p:media value="#{mediaBean.media}" width="100%" height="590"
                 player="pdf" rendered="#{not empty mediaBean.media}" />
    </p:outputPanel>
</h:form>

不要忘记更新D:/cars.pdf以在您自己的文件系统中定位pdf。

此示例下载pdf,我如何使用特殊标题写入输出流以供下载?仅当您的浏览器不支持pdf显示时,此示例才下载。我已经在Chrome上测试过了,pdf文件就在按钮后面显示为页面的一部分。无论如何,我已经更新了答案,以减少混淆。现在,如果您包括一个带有
标记的按钮,我可以删除我的答案。另外,请查看,在找不到pdf播放机时显示替代文本。我的原始答案中没有找到pdf播放机的文本,但我在@user3027786 comment;)之后将其删除。)我尝试了上面的方法,它适用于Chrome和Firefox,但IE版本8我没有看到任何内容。只有灰色区域没有其他线索:(服务器端没有例外。原因可能是什么???此外,我观察到PDF播放器进行缓存。它第一次向服务器发送请求,后来没有发送任何请求。如何避免这种缓存?
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.apache.commons.io.FileUtils;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

@ManagedBean
@SessionScoped
public class MediaBean {

    private byte[] data;

    public void generatePrintOutput() throws IOException {
        //simulates the genration of the pdf
        data = FileUtils.readFileToByteArray(new File("D:/cars.pdf"));
    }

    public StreamedContent getMedia() throws IOException {
        if (data == null) {
            return null;
        }
        InputStream stream = new ByteArrayInputStream(data);
        StreamedContent pdf = new DefaultStreamedContent(stream, "application/pdf");
        return pdf;
    }
}