Question

J'utilise JSF 2.0 (Eclipse IDE) et j'ai une méthode dans un de mes haricots qui génère des fichiers PDF à l'aide Apache FOP 1.0. Lorsque je clique sur le bouton « makePDF » sur ma page JSF, généré PDF ouvre dans la même fenêtre où ma page est (et je dois utiliser le bouton « retour » après voir / sauvegarder / imprimer le PDF).

Je peux changer cela d'une manière que lorsque le bouton « makePDF » est pressé standard dialogue contextuel apparaît et me demande si je veux enregistrer le fichier ou l'ouvrir avec Adobe Reader.

Est-il possible que, lorsque je clique sur mon bouton « makePDF », PDF est généré ouvert directement dans AdobeReader (et j'ai encore ma page JSF et ne avez pas besoin de confirmer quoi que ce soit) ??? De plus (il est pas vraiment nécessaire, mais bon à savoir), est-il un moyen de l'ouvrir dans une nouvelle fenêtre ou l'envoyer directement à l'imprimante?

Voici la partie principale de mon code (je supprimé des choses hors de propos):

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"); il ouvre dans la même fenêtre, sinon il me demande de sauver ou d'ouvrir.

Merci d'avance.

Était-ce utile?

La solution

Ouverture d'une demande dans une nouvelle fenêtre est pas directement une préoccupation JSF. Il est plus un problème de HTML.

Ajouter target="_blank" à la forme

<h:form target="_blank">

et il va présenter la demande dans un nouvel onglet / fenêtre.

Envoi à l'imprimante du client est directement pas possible sans introduire un morceau de code qui fonctionne à côté client que l'homme au milieu, comme une applet.

Autres conseils

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 alors s'il vous plaît laissez-moi savoir.

Exemple d'utilisation: L'utilisateur saisit les données sous une forme générée JSF nécessaire à la création de PDF (PDF est généré à partir d'un 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) entrer:

    <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 showPdf () est appelée, vous pouvez définir le champ pdfDownloadable true et le même résultat est rendu à nouveau, mais cette fois avec window.open () en elle.

it helps quelqu'un ..

si vous voulez ouvrir un fichier PDF directement, pls utiliser

response.setHeader("Content-Disposition", "inline");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top