使用打印机和流

时间:2014-02-07 10:44:28

标签: jsf-2 primefaces

我正在从Richfaces迁移到Primefaces。在我现有的应用程序中,我有一个打印用例,当用户单击打印按钮时,Printer bean将pdf(以及print 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 属性可以实现神奇的.i.e。将outputstream和printObject传递给我的printerBean.generatePrintOutput方法。请帮助我如何用primefaces实现这一点。

1 个答案:

答案 0 :(得分:0)

查看此代码示例:

视图

<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>

<强> MediaBean

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;
    }
}

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