2010-12-10 65 views
1

J'utilise JSF 2.0 (IDE Eclipse) et j'ai une méthode dans un de mes beans qui génère des fichiers PDF en utilisant Apache FOP 1.0. Lorsque je clique sur le bouton "makePDF" sur ma page JSF, le PDF généré s'ouvre dans la fenêtre SAME où se trouve ma page (et je dois utiliser le bouton 'retour' après avoir vu/enregistré/imprimé PDF).Comment afficher java (jsf) généré pdf directement dans AdobeReader

Je peux changer cela de manière à ce que le bouton "makePDF" soit pressé, une boîte de dialogue pop-out standard apparaît et me demande si je souhaite enregistrer le fichier ou l'ouvrir avec AdobeReader.

Y at-il une manière que, quand je clique sur mon bouton "makePDF", le pdf généré soit directement ouvert dans AdobeReader (et j'ai toujours ma page JSF et n'ai pas besoin de confirmer quoi que ce soit) ??? Aussi (ce n'est pas vraiment nécessaire, mais bon à savoir), est-il possible de l'ouvrir dans une nouvelle fenêtre ou de l'envoyer directement à l'imprimante?

Voici la partie principale de mon code (je supprimé des choses non pertinentes):

public void makePDF(long contractId, int documentType) { 

    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = facesContext.getExternalContext(); 
    String basePath = externalContext.getRealPath("/"); 

    try { 
     fopFactory.setUserConfig(new File(basePath + "/pdf_transform/config/userconfig.xml")); 
     fopFactory.setBaseURL(basePath); 
     fopFactory.getFontManager().setFontBaseURL(basePath); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); 
    foUserAgent.setBaseURL(fopFactory.getBaseURL()); 

    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse(); 
    response.reset(); 
    response.setHeader("Content-Type", "application/pdf"); 
    response.setHeader("Content-disposition", "attachment"); 
    BufferedOutputStream output = null; 

    try { 
     output = new BufferedOutputStream(response.getOutputStream(), 10240); 
     Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output); 

     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(new StreamSource(xsltfile)); 

     Source src = new DOMSource(makeXML(contract)); // my method 
     Result res = new SAXResult(fop.getDefaultHandler()); 

     transformer.transform(src, res); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    facesContext.responseComplete(); 
}` 

Quand je supprimer response.setHeader("Content-disposition", "attachment"); ouvre dans la même fenêtre, sinon il me demande de sauver ou d'ouvrir.

Merci d'avance.

Répondre

2

L'ouverture d'une requête dans une nouvelle fenêtre n'est pas directement une préoccupation JSF. C'est plus une préoccupation HTML.

Ajouter target="_blank" à la forme

<h:form target="_blank"> 

et il va soumettre la demande dans un nouvel onglet/fenêtre.

L'envoi direct à l'imprimante du client n'est pas possible sans introduction d'un morceau de code qui s'exécute du côté du client en tant qu'homme au milieu, comme une applet.

+0

Merci, j'ai raté cela dans votre article de traitement PDF parce que je me suis concentré sur le code java seulement :) Pourtant, cela ne répond pas à ma question principale, je peux l'ouvrir directement dans AdobeReader (pas dans la fenêtre) ou changer d'approche? – Nikola

+0

C'est un paramètre du navigateur que vous ne pouvez pas contrôler. Dans Firefox par exemple, cochez * Outils> Options> Applications *. – BalusC

+0

Je ne le savais pas, merci. Bien qu'il s'est avéré que ce n'était pas vraiment lié à jsf/fop, cela a résolu mon problème. – Nikola

2

si vous voulez ouvrir un fichier PDF directement, pls utiliser

response.setHeader("Content-Disposition", "inline"); 
2

J'ai eu un problème similaire et trouvé heureusement une façon élégante de le résoudre. Si quelqu'un a une meilleure solution, s'il vous plaît faites le moi savoir.

Cas d'utilisation: L'utilisateur entre les données dans une forme générée par JSF nécessaire à la création de PDF (le PDF est généré à partir d'une servlet). Si la validation échoue, les messages d'erreur sont rendus, mais si tout va bien fichier pdf ouvre dans une nouvelle fenêtre :-)

Ma solution:.

  1. Dans un template.xhtml (ou le site qui définit facelets) entrez:

    <ui:define name="head"> 
         <h:outputScript rendered="#{myBean.pdfDownloadable}"> 
          window.open('#{myBean.pdfUrl}',"pdfWindow","width=800,height=900,left=50,top=10") 
         </h:outputScript> 
    </ui:define> 
    
  2. Votre lien de commande dans les points de forme JSF à la méthode d'action dans monBean ainsi (par exemple myBean.showPdf())

  3. Si les données de formulaire sont valides et showP df() est appelé, vous pouvez définir le champ pdfDownloadable sur true et le même résultat est rendu à nouveau mais cette fois-ci avec window.open().

Espérons que cela aide quelqu'un ..