Domanda

Sto usando JSF 2.0 (Eclipse IDE) e ho un metodo in uno dei miei fagioli che genera alcuni file PDF usando Apache Fop 1.0. Quando faccio clic sul pulsante "MakePDF" sulla mia pagina JSF, il PDF generato si apre nella stessa finestra in cui è la mia pagina (e devo usare il pulsante 'back' dopo aver visualizzato/salvato/stampato pdf).

Posso cambiarlo in modo tale che quando viene premuto il pulsante "MakePDF", appare la finestra di dialogo pop-out standard e mi chiede se desidero salvare file o aprirlo con Adobereader.

C'è un modo in cui, quando faccio clic sul mio pulsante "MakePDF", il PDF generato è aperto direttamente in Adobereader (e ho ancora la mia pagina JSF e non ho bisogno di confermare nulla) ??? Inoltre (non è davvero necessario, ma è bello da sapere), c'è un modo per aprirlo in una nuova finestra o inviarlo direttamente alla stampante?

Ecco la parte principale del mio codice (ho eliminato alcune cose irrilevanti):

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

Quando rimuovo response.setHeader("Content-disposition", "attachment"); Si apre nella stessa finestra, altrimenti mi chiede di salvare o aprire.

Grazie in anticipo.

È stato utile?

Soluzione

L'apertura di una richiesta in una nuova finestra non è direttamente una preoccupazione JSF. È più una preoccupazione HTML.

Aggiungere target="_blank" alla forma

<h:form target="_blank">

E invierà la richiesta in una nuova scheda/finestra.

L'invio diretto della stampante del client non è possibile senza introdurre un pezzo di codice che funziona sul lato client come uomo nel mezzo, come un'applet.

Altri suggerimenti

Ho avuto un problema simile e fortunatamente ho trovato un modo elegante per risolverlo. Se qualcuno ha una soluzione migliore, per favore fatemelo sapere.

Caso di utilizzo: l'utente inserisce i dati in un modulo generato da JSF necessario per la creazione di PDF (il PDF viene generato da un servlet). Se la convalida non riesce, i messaggi di errore vengono resi ma se tutto va bene il file PDF si apre in una nuova finestra. :-)

La mia soluzione:

  1. In un modello.xhtml (o il sito che definisce le facciate) Immettere:

    <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. Il tuo link di comando nel metodo di punta a forma JSF anche in MyBean (ad es. MyBean.Showpdf ())

  3. Se i dati del modulo sono validi e showpdf () viene chiamato, è possibile impostare il campo PDFDownloable su True e lo stesso risultato viene nuovamente reso ma questa volta con Window.open () in esso.

Spero che aiuti qualcuno ..

Se si desidera aprire direttamente un PDF, utilizzo

response.setHeader("Content-Disposition", "inline");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top