Jsf 如何从java在不同的选项卡中显示两个pdf

Jsf 如何从java在不同的选项卡中显示两个pdf,jsf,primefaces,Jsf,Primefaces,对不起,我的英语很差,但我真的很想在浏览器的不同选项卡上同时显示来自jasper report的两份pdf报告。我正在使用JavaJSF,primefaces。主要思想是单击按钮时,在不同的选项卡中显示此报告。我尝试这样做: 我在托管Bean中有以下内容: public void showReports() { RequestContext.getCurrentInstance().execute("document.getElementB

对不起,我的英语很差,但我真的很想在浏览器的不同选项卡上同时显示来自jasper report的两份pdf报告。我正在使用JavaJSF,primefaces。主要思想是单击按钮时,在不同的选项卡中显示此报告。我尝试这样做:

我在托管Bean中有以下内容:

        public void showReports() {  
                  RequestContext.getCurrentInstance().execute("document.getElementById('fromGeneral:rep2').click();");
            RequestContext.getCurrentInstance().execute("document.getElementById('fromGeneral:rep3').click();");
            }

    public void printReport(String name) {
            try {
                Map<String, Object> mapParametros = new HashMap<>();
                mapParametros.put("CORR", corr);
                printJasper(mapParametros, new File("/Jasper/Reports/" + name));
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }

  public void printJasper(Map<String, Object> reportValues, File fileJ) {

        ByteArrayInputStream input = null;
        BufferedOutputStream output = null;
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();

        try {
            facesContext = FacesContext.getCurrentInstance();
            externalContext = facesContext.getExternalContext();
            response = (HttpServletResponse) externalContext.getResponse();

            FileInputStream file = new FileInputStream(fileJ);
            JasperReport compiledTemplate = (JasperReport) JRLoader.loadObject(file);

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            JasperPrint jasperPrint = JasperFillManager.fillReport(compiledTemplate, reportValues, dataSourceP.getConnection());

            JRExporter exporter = new JRPdfExporter();
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
            exporter.setParameter(JRPdfExporterParameter.PDF_JAVASCRIPT, "this.print();");
            exporter.exportReport();

            input = new ByteArrayInputStream(out.toByteArray());

            response.reset();
            response.setHeader("Content-Type", "application/pdf");
            response.setHeader("Content-Length", String.valueOf(out.toByteArray().length));
            response.setHeader("Content-Disposition", "inline; filename=\"ticket.pdf\"");
            output = new BufferedOutputStream(response.getOutputStream(), Constants.DEFAULT_BUFFER_SIZE);

            byte[] buffer = new byte[Constants.DEFAULT_BUFFER_SIZE];
            int length;
            while ((length = input.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }
            output.flush();

        } catch (Exception exception) {
            System.out.println(exception.getMessage());
        } finally {
            try {
                if (output != null) {
                    output.close();
                }
                if (input != null) {
                    input.close();
                }
            } catch (Exception exception) {
                /* ... */
            }
        }
        facesContext.responseComplete();
    }
public void showReports(){
RequestContext.getCurrentInstance()执行(“document.getElementById('fromGeneral:rep2')。单击();”;
RequestContext.getCurrentInstance()执行(“document.getElementById('fromGeneral:rep3')。单击();”;
}
公共作废打印报告(字符串名称){
试一试{
Map MapParameteros=新建HashMap();
MapParameteros.put(“CORR”,CORR);
printJasper(MapParameteros,新文件(“/Jasper/Reports/”+name));
}捕获(例外e){
System.out.println(e.getMessage());
}
}
public void printJasper(映射报告值,文件fileJ){
ByteArrayInputStream输入=null;
BufferedOutputStream输出=null;
FacesContext FacesContext=FacesContext.getCurrentInstance();
ExternalContext=facesContext.getExternalContext();
HttpServletResponse=(HttpServletResponse)externalContext.getResponse();
试一试{
facesContext=facesContext.getCurrentInstance();
externalContext=facesContext.getExternalContext();
response=(HttpServletResponse)externalContext.getResponse();
FileInputStream file=新的FileInputStream(fileJ);
JasperReport compiledTemplate=(JasperReport)JRLoader.loadObject(文件);
ByteArrayOutputStream out=新建ByteArrayOutputStream();
JasperPrint JasperPrint=JasperFillManager.fillReport(compiledTemplate,reportValues,dataSourceP.getConnection());
jreporter=新的JRPdfExporter();
exporter.setParameter(jreporterParameter.JASPER_PRINT,jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_流,out);
exporter.setParameter(JRPdfExporterParameter.PDF_JAVASCRIPT,“this.print();”);
出口商。出口报告();
input=newbytearrayinputstream(out.toByteArray());
response.reset();
setHeader(“内容类型”、“应用程序/pdf”);
setHeader(“内容长度”,String.valueOf(out.toByteArray().Length));
setHeader(“内容处置”,“内联;文件名=\”ticket.pdf\”;
输出=新的BufferedOutputStream(response.getOutputStream(),Constants.DEFAULT\u BUFFER\u SIZE);
byte[]buffer=新字节[Constants.DEFAULT_buffer_SIZE];
整数长度;
而((长度=输入.读取(缓冲区))>0){
输出.写入(缓冲区,0,长度);
}
output.flush();
}捕获(异常){
System.out.println(exception.getMessage());
}最后{
试一试{
if(输出!=null){
output.close();
}
如果(输入!=null){
input.close();
}
}捕获(异常){
/* ... */
}
}
facesContext.responseComplete();
}
在我看来,这是一个重要问题:

<h:form>          
    <p:commandButton value="Show them" action="#{reportBean.showReports()}"/>
    <p:commandButton value="REPORT 1" id="rep1"  style="font-size: 25px; float:right;visibility: hidden;" action="#{reportBean.printReport("Report1")}" ajax="false" onclick="this.form.target = '_blank';"/>
    <p:commandButton value="REPORT 2" id="rep2"  style="font-size: 25px; float:right;visibility: hidden;" action="#{reportBean.printReport("Report2")}" ajax="false" onclick="this.form.target = '_blank';"/>
    </h:form>

但不起作用,它只显示第二份报告。 救命啊!。
谢谢

像我现在使用的那样,尝试使用
p:commandLink
进行点击

<p:commandLink id="PreviewR1"   value="Print Preview" ajax="false" action="#{reportBean.printReport("Report1")}" target="_blank" />
<p:commandLink id="PreviewR2"   value="Print Preview" ajax="false" action="#{reportBean.printReport("Report2")}" target="_blank" />


它将在单独的浏览器选项卡中打开报告1和报告2,而您的原始网页将保持不变。

您只是没有单击正确的按钮:

public void showReports() {  
                  RequestContext.getCurrentInstance().execute("document.getElementById('fromGeneral:rep2').click();");
            RequestContext.getCurrentInstance().execute("document.getElementById('fromGeneral:rep3').click();");
            }

您正在单击rep2和rep3。rep3不存在,您需要单击rep1。这就是为什么只显示第二个报告的原因。

最后我找到了其他解决方法

方法
showReports()
改为单击两个按钮,这将打开两个xhtml,每个xhtml内部都有一个显示报告的带autorun true的remotecommand。我不知道这是否是最好的方法,但它是有效的


谢谢你的评论

你好,萨尔兹!谢谢你的评论。但它不起作用,它仍在显示一份报告/尝试使用不同的方法,即printReport1 printReport2,而不是使用args。我也这样做了,但仍然不起作用,但我发布了我解决它的方法。谢谢你的回答。谢谢你的回答,我错了!但是我已经把它修好了,仍然不起作用。