2016-11-10 5 views
0

私はそれが簡単な解決策になるだろうと確信していますが、私の問題について助けを見つけることはできません。私はpdfファイルを作成しています。それを開く前にユーザーが保存しなければなりません。しかし、ユーザーがそれを保存するかどうかを決定する前に、そのファイルを開く必要があります。しかし、私はiTextに新しいタブでそれを開くように指示する方法を見つけることができません。私は何をすればよいですか?iTextで新しいブラウザタブで新しいPDFファイルを開く方法Java

私のコードですが、私はこのメソッドを "document.close();の直後に呼び出します。 :

public void openPDF(String nomDoc, String nomFichier) throws IOException { 

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

    // File file = new File(getFilePath(), getFileName()); 
    File file = new File(nomFichier); 
    BufferedInputStream input = null; 
    BufferedOutputStream output = null; 

    try { 

     input = new BufferedInputStream(new FileInputStream(file), 
       DEFAULT_BUFFER_SIZE); 

     response.reset(); 
     response.setHeader("Content-Type", "application/pdf"); 
     response.setHeader("Cache-Control", 
       "must-revalidate, post-check=0, pre-check=0"); 
     response.setHeader("Content-Length", String.valueOf(file.length())); 
     // response.setHeader("Content-Disposition", "inline; filename=\"" + 
     // nomFichier + "\""); 
     response.setHeader("Content-Disposition", "form-data;filename=\"" 
       + nomDoc + "\""); 
     output = new BufferedOutputStream(response.getOutputStream(), 
       DEFAULT_BUFFER_SIZE); 

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

    } finally { 
     close(output); 
     close(input); 
    } 
    facesContext.responseComplete(); 
} 

私のコマンドボタン:

<p:commandButton process="checkboxContrats" 
         icon="ui-icon-file-pdf" value="Editer les fiches de paie" 
         action="#{paieAgentView.printPaieAgent()}" update="@form" 
         escape="false" ajax="false" /> 

マイビュー:

public void creerPDF(List<FichePaie> listFdP, Date dateDebut, Date dateFin) throws DocumentException, 
     IOException { 
    ServletContext servletContext = (ServletContext) FacesContext 
      .getCurrentInstance().getExternalContext().getContext(); 
    String nomRelatif = servletContext.getRealPath(NOMFICHIER); 

    Date dtt = new Date(); 
    Phrase para = new Phrase("Date d'édition : " + sdf.format(dtt), 
      FontFactory.getFont(FontFactory.HELVETICA, 8, Font.NORMAL)); 
    Document document = this.getDocumentPortraitSmallMargin(nomRelatif, 
      para); 

    document.open(); 
    document.add(new Chunk("")); 

    document.close(); 
    openPDF(filename, nomRelatif); 

} 

はあなたの助けをいただき、ありがとうございます。

+0

「Content-Disposition」ヘッダーを削除することはありますか? – Henry

+0

私はコンテンツの配置をインラインに変更し、現在のタブで開きます。それは始まりです – coshikipix

+0

そして私はUmais Gillaniのヒントを追加しました^^ – coshikipix

答えて

0

は皆さんありがとう、

まずiはインラインに、コンテンツの配置を変更しなければなりませんでしたonclick:

<p:commandButton process="checkboxContrats" 
         icon="ui-icon-file-pdf" value="Editer les fiches de paie" 
         action="#{paieAgentView.printPaieAgent()}" update="@form" 
         escape="false" ajax="false" onclick="this.form.target='_blank'"/> 
1

新しいウィンドウまたはタブでPDFファイルを開くことは、HTMLからの呼び出しによって異なります。あなたがGETリクエストを使用している場合は、ケースのPOSTリクエストで

<a href="/url/to/servlet" target="_blank"/> 

GET

のようにそれを行うことができますtarget="_blank"は、そのの世話をする

<form method="post" action="url/to/servlet" 
    target="_blank"> 

Response.ContentType = "application/" & "octet-stream" 
       Response.AddHeader("Content-disposition", "attachment; filename="myfile.pdf") 
       Response.AddHeader("Content-Length", buffer.Length.ToString()) 

       '**** Change next line to use response output stream 
       Response.BinaryWrite(buffer) 
       Response.Flush() 
       Response.Close() 
       Response.End() 

(コードはVBであるが、C#での大きな違いではありません):

+0

@coshikipix答えを見てください[ここ](http://stackoverflow.com/questions/11611296/open-new-window-by-post-using -hcommandbutton)を押します。これはあなたにアイデアを与えるかもしれません。私はフォームタグに 'target =" _ blank "を追加するか、またはコマンドボタンで' onclick = "this.form.target = '_ blank'" 'を追加する必要があると思います。 –

+0

Henryのヒントと結びついてありがとう、それは完璧に動作します! – coshikipix

-1

これらのヘッダを使用してみてください。これは、ブラウザの下部にあるアイコンでファイルをダウンロードする必要があります。開いている場合は、新しいタブまたはpdfの既定のアプリケーションを開きます。

response.setHeader("Content-Disposition", "inline;filename=\"" 
       + nomDoc + "\""); 

、その後、私は、ターゲットと新しいタブで開くには、私のコマンドボタンを伝えるために持っていた:

+0

これはJavaのトピックですが、私はあなたのアイデアを試してみましょう;) – coshikipix

+0

申し訳ありませんが、コードは似ています。しかし、主なアイデアはあなたのヘッダーを "application/octet-stream"に変更して、それを添付ファイル形式で開くようにすることです。 –

関連する問題