【问题标题】:Using Printer with Stream将打印机与流一起使用
【发布时间】:2014-02-07 10:44:28
【问题描述】:

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

<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 实现这一目标。

【问题讨论】:

    标签: jsf-2 primefaces


    【解决方案1】:

    查看此代码示例:

    观点

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

    【讨论】:

    • 此示例下载 pdf,我怎样才能写入带有特殊标题的输出流以供下载?
    • 示例仅在您的浏览器不支持 pdf 显示时下载。我已经在 Chrome 中对其进行了测试,并且 pdf 在按钮之后显示为页面的一部分。无论如何,我已经更新了答案以减少混乱。
    • 现在,如果您包含一个带有&lt;p:printer&gt; 标签的按钮,我可以删除我的答案。另外,请查看showcase example,以在找不到 pdf 播放器时显示替代文本。
    • 我的原始答案是找不到 pdf 播放器的文本,但我在@user3027786 评论后删除了它;)
    • 我尝试了上述方法,它适用于 Chrome 和 Firefox,但 IE 版本 8 我看不到任何内容。只有灰色区域没有其他线索:(服务器端也不例外。可能是什么原因???此外,我观察到PDF播放器会缓存。第一次向服务器发送请求,后来没有发送请求。怎么能我避免这种缓存?
    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2023-03-18
    • 2016-10-22
    • 2016-12-19
    • 2011-08-18
    • 2013-08-18
    • 1970-01-01
    相关资源
    最近更新 更多