Frage

Ich verwende JSF 2.0 (Eclipse IDE) und habe eine Methode in einer meiner Bohnen, die einige PDF -Dateien mit Apache FOP 1.0 generiert. Wenn ich auf meiner JSF -Seite auf die Schaltfläche "makepdf" klicke, wird generiertes PDF im selben Fenster geöffnet, in dem meine Seite ist (und ich muss die Schaltfläche "Zurück" verwenden, nachdem ich PDF anzeigen/speichern/drucken kann).

Ich kann dies so ändern, dass beim Drücken der Taste "makepdf" ein Standard-Pop-out-Dialog erscheint und mich fragt, ob ich Datei speichern oder mit Adoberader öffnen möchte.

Gibt es eine Möglichkeit, wenn ich auf meine Schaltfläche "makepdf" klicke, generierte PDF direkt in Adoberader geöffnet wird (und ich habe immer noch meine JSF -Seite und muss nichts bestätigen)? Auch (es ist nicht wirklich benötigt, 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 (ich habe einige irrelevante Dinge gelöscht):

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 entferne response.setHeader("Content-disposition", "attachment"); Es öffnet sich im selben Fenster, sonst fordert es mich auf, zu speichern oder zu öffnen.

Danke im Voraus.

War es hilfreich?

Lösung

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

Hinzufügen target="_blank" zur Form

<h:form target="_blank">

und es wird die Anfrage in eine neue Registerkarte/ein neues Fenster einreichen.

Wenn Sie direkt an den Drucker des Clients gesendet werden, ist nicht möglich, ohne einen Code einzulegen, der wie ein Applet auf der Client -Seite als Mann in der Mitte ausgeführt wird.

Andere Tipps

Ich hatte ein ähnliches Problem und fand zum Glück eine elegante Möglichkeit, es zu lösen. Wenn jemand eine bessere Lösung hat, lassen Sie es mich bitte wissen.

Anwendungsfall: Der Benutzer gibt Daten in ein für die PDF -Erstellung erzeugter JSF -generiertes Formular ein (PDF wird aus einem Servlet generiert). Wenn die Validierung fehlschlägt, werden Fehlermeldungen abgegeben, aber wenn alles in Ordnung läuft, wird die PDF-Datei in einem neuen Fenster geöffnet. :-)

Meine Lösung:

  1. In einer Vorlage.xhtml (oder der Site, die Facelets definiert) geben Sie ein:

    <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 Befehlslink in der JSF-Form zeigt auch in MyBean (z. B. mybean.showpdf ()).

  3. Wenn Formulardaten gültig sind und Showpdf () aufgerufen wird, können Sie das PDFDownLoadable -Feld auf True einstellen, und das gleiche Ergebnis wird erneut mit window.open () darin gerendert.

Hoffe es hilft jemandem ..

Wenn Sie einen PDF direkt öffnen möchten, verwenden die PLS

response.setHeader("Content-Disposition", "inline");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top