2016-11-01 8 views
-1

申し訳ありませんが英語は貧弱ですが、ブラウザの異なるタブで同時にジャスパーレポートの2つのpdfレポートを表示したいと思います。私はjava jsf、primefacesで作業しています。主要なアイデアは、このボタンがクリックされたときに、このレポートが異なるタブで表示されることです。私はこれを行うにしてみてください。2種類のPDFをJavaから別のタブに表示するには

私はマネージド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(); 
    } 

Anが、これが私の見解で:

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

しかしdoesn't仕事は、それだけで目のレポートを表示します。 Help! ありがとう!

答えて

0

最後に、私はそれを解決する別の方法を見つけました。

showReports() 2つのボタンをクリックする代わりに、この2つのxhtmlはそれぞれ<h.form>のautorun trueのremotecommandを持ち、レポートを表示します。私はそれが最良の方法であるかどうかはわかりませんが、それは機能します。

ご意見ありがとうございました

0

私が使っているように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を開きます。

+0

こんにちはSarz!コメントありがとう。しかし、それは動作しません、それはまだ1つのレポートを示しています。 :/ –

+0

argsを取る代わりにprintReport1 printReport2という異なるメソッドを使用してみてください。 – Sarz

+0

私もそれをやった、それはまだ動作しませんが、私はそれを解決するものを投稿しました。お返事ありがとうございました。 –

0

あなただけの正しいボタンをクリックしないでください:あなたはREP2とREP3をクリックしている

​​

。 rep3が存在しない場合は、代わりにrep1をクリックする必要があります。 2番目のレポートだけが表示されるのはその理由になります。

+0

お返事ありがとうございます、私の間違い!しかし、私はすでにそれを修正し、まだ動作しません。 –

関連する問題