2010-12-10 8 views
1

Ich benutze JSF 2.0 (Eclipse IDE) und ich habe eine Methode in einer meiner Bohnen, die einige PDF-Dateien mit Apache FOP 1.0 generiert. Wenn ich auf der JSF-Seite auf die Schaltfläche "makePDF" klicke, wird die generierte PDF-Datei im GLEICHEN Fenster geöffnet, in dem sich meine Seite befindet (und ich muss die Schaltfläche "Zurück" verwenden, nachdem ich PDF angesehen/gespeichert/gedruckt habe).Wie man java (jsf) erzeugt pdf direkt in AdobeReader

Ich kann dies so ändern, dass beim Drücken der Taste "makePDF" der Popup-Standarddialog erscheint und fragt, ob ich die Datei speichern oder mit AdobeReader öffnen möchte.

Gibt es eine Möglichkeit, dass, wenn ich auf meine "makePDF" -Schaltfläche klicke, generierte PDF direkt in AdobeReader geöffnet wird (und ich habe immer noch meine JSF-Seite und brauche nichts zu bestätigen) ??? Auch (es ist nicht wirklich notwendig, aber gut zu wissen), gibt es eine Möglichkeit, es in einem neuen Fenster zu öffnen oder direkt an den Drucker zu senden?

Hier ist der Hauptteil meines Codes (i gelöscht einige irrelevant Zeug):

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(); 
}` 

Wenn ich response.setHeader("Content-disposition", "attachment"); entfernen Sie sie im selben Fenster öffnet, sonst ist es fragt mich oder offen zu speichern.

Vielen Dank im Voraus.

Antwort

2

Das Öffnen einer Anfrage in einem neuen Fenster ist nicht direkt ein JSF-Problem. Es ist mehr eine HTML-Angelegenheit.

target="_blank" zum Formular hinzufügen

<h:form target="_blank"> 

und es wird die Anforderung in einem neuen Tab/Fenster einreichen.

Senden an den Client-Drucker direkt ist nicht möglich, ohne ein Stück Code, der auf der Client-Seite als Mann in der Mitte läuft, wie ein Applet.

+0

Danke, das habe ich in Ihrem PDF-Handling-Artikel verpasst, weil ich mich nur auf Java-Code konzentriert habe :) Trotzdem beantwortet das meine Hauptfrage nicht, dh kann ich direkt in AdobeReader öffnen (nicht im Fenster) oder ich habe um meinen Ansatz zu ändern? – Nikola

+0

Das ist eine Browsereinstellung, die Sie nicht kontrollieren können. In Firefox zum Beispiel, überprüfen Sie * Extras> Optionen> Anwendungen *. – BalusC

+0

Wusste das nicht, danke. Obwohl es sich herausstellte, dass es nicht wirklich jsf/fop war, löste es mein Problem. – Nikola

2

, wenn Sie eine PDF direkt öffnen möchten, pls verwenden

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

hatte ich ein ähnliches Problem und fand glücklicherweise eine elegante Art und Weise, es zu lösen. Wenn jemand eine bessere Lösung hat, lass es mich wissen.

Anwendungsfall: Der Benutzer gibt Daten in einem JSF-generierten Formular ein, das für die PDF-Erstellung erforderlich ist (PDF wird von einem Servlet generiert). Wenn die Validierung fehlschlägt, werden Fehlermeldungen gemacht, aber wenn alles gut geht pdf-Datei öffnet sich in einem neuen Fenster :-)

Meine Lösung:. Facelets

  1. In einem template.xhtml (oder die Website, die definiert, eingeben):

    <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. Ihr Befehl Link in den JSF-Form Punkten Aktionsmethode in MyBean als auch (zB myBean.showPdf())

  3. Wenn Formdaten gültig sind und showP Wenn df() aufgerufen wird, können Sie das Feld pdfDownloadable auf true setzen und das gleiche Ergebnis wird erneut angezeigt, diesmal jedoch mit window.open().

Hoffe es hilft jemandem ..