Pregunta

Estoy usando JSF 2.0 (Eclipse IDE) y tengo un método en uno de mis frijoles que genera algunos archivos PDF usando Apache FOP 1.0. Cuando hago clic en el botón "MakEPDF" en mi página JSF, PDF generado se abre en la misma ventana donde está mi página (y tengo que usar el botón 'Back' después de ver/Guardar/imprimir PDF).

Puedo cambiar esto de una manera que cuando se presiona el botón "MakEPDF", aparece el diálogo emergente estándar y me pregunta si deseo guardar el archivo o abrirlo con ADOBEREADER.

¿Hay alguna forma de que, cuando hago clic en mi botón "MakEPDF", se genere PDF generado directamente en Acobereader (y todavía tengo mi página JSF y no necesito confirmar nada)? Además (no es realmente necesario, pero es bueno saberlo), ¿hay alguna manera de abrirlo en una nueva ventana o enviarlo directamente a la impresora?

Aquí está la parte principal de mi código (eliminé algunas cosas irrelevantes):

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

Cuando quito response.setHeader("Content-disposition", "attachment"); Se abre en la misma ventana, de lo contrario me pide que guarde o abra.

Gracias por adelantado.

¿Fue útil?

Solución

Abrir una solicitud en una nueva ventana no es directamente una preocupación por JSF. Es más una preocupación HTML.

Agregar target="_blank" a la forma

<h:form target="_blank">

y enviará la solicitud a una nueva pestaña/ventana.

Enviar directamente a la impresora del cliente no es posible sin introducir algún código que se ejecute en el lado del cliente como hombre en el medio, como un applet.

Otros consejos

Tuve un problema similar y afortunadamente encontré una forma elegante de resolverlo. Si alguien tiene una mejor solución, hágamelo saber.

Caso de uso: el usuario ingresa datos en un formulario generado por JSF necesario para la creación de PDF (PDF se genera a partir de un servlet). Si la validación falla, se renderizan los mensajes de error, pero si todo va bien, el archivo PDF se abre en una nueva ventana. :-)

Mi solución:

  1. En una plantilla.xhtml (o el sitio que define facelets) ingrese:

    <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. Su enlace de comando en el método de acción de forma JSF a MyBean también (por ejemplo, mybean.showpdf ())

  3. Si los datos del formulario son válidos y se llama showpdf (), puede establecer el campo PDFDownloadable en verdadero y el mismo resultado se vuelve a reproducirse, pero esta vez con Window.open () en él.

Espero que ayude a alguien ..

Si desea abrir un PDF directamente, por favor use

response.setHeader("Content-Disposition", "inline");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top