Message: Missing PDF in PrimeFaces Extensions Docu

2019-03-02 01:26发布

问题:

This is my code JAVA:---

public StreamedContent getTempPdfFile() throws IOException {
     File testPdfFile = Paths.get("D:\\AFC150_20180819_0103.pdf").toFile();
     return new DefaultStreamedContent(new FileInputStream(testPdfFile), "application/pdf",
                "AFC150_20180819_0103");
}

JSF:---

 <pe:documentViewer height="500" width = "1000" url="#{realReport.tempPdfFile}"/>      

error:--PDF.js v1.0.21 (build: f954cde) Message: Missing PDF "http://localhost:8080/BACKEND_SAWS_WEB/javax.faces.resource/documentviewer/org.primefaces.model.DefaultStreamedContent@69573926?pfdrid_c=false&uid=4981c898-59bf-49f2-9c99-367855ec2658".

回答1:

You are not using the component correctly it is not "url=" it is "value=" when using streamed content. URL property is only used when pointing to a document. You are trying to stream content.

Here is what you should have...

<pe:documentViewer height="500" width="1000" value="#{realReport.tempPdfFile}"/>


回答2:

I tried this using:

  1. Java EE 7
  2. GlassFish 4.1.2
  3. PrimeFaces 6.2
  4. PrimeFaces-Extensions 6.2.9

At the bean (class) code:

@ManagedBean
@ApplicationScoped
public class DocumentViewerController {

The scope is @ApplicationScoped. I have a private StreamedContent attribute. And two main public methods:

First method: It's called from actionListener attribute of a p:commandButton. The method receive a parameter (in my case).

public void onPrerender(Tramite tramite) {    
    tramiteSelected = tramite;
    numeroTramite = tramite.getNumero();
    contrato = tramite.getContrato();
} 

Second method: It's used from a pe:documentViewer inside a dialog component, like this:

<pe:documentViewer id="certificadoViewer"
                   height="500px"
                   width="750px"
                   cache="false"
                   value="#{documentViewerController.certificado}"
                   download="certificado_#{documentViewerController.numero}_#{documentViewerController.contrato}.pdf" />

Note: The 2nd method works like a property (getter and setter). THAT'S THE TRICK.

The final code from my project is:

# Bean (DocumentViewerController.java):

package com.epmrpsd.certificado.consulta.controladores;

import com.epmrpsd.certificado.consulta.controladores.util.JsfUtil;
import com.epmrpsd.certificado.consulta.entidades.Tramite;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

/**
 *
 * @author pbonilla
 */
@ManagedBean
@ApplicationScoped
public class DocumentViewerController {

    private StreamedContent content;
    private Integer numeroTramite;
    private Integer contrato;
    private Tramite tramiteSelected;

    // Path where the file exists
    private String pdfPathDirectory = "C:\\Users\\<user>\\certificados\\";

    public void onPrerender(Tramite tramite) {

        tramiteSelected = tramite;
        numeroTramite = tramite.getNumero();
        contrato = tramite.getContrato();
    }

    public StreamedContent getCertificado() {

        InputStream stream = null;
        try {
            File file = new File(pdfPathDirectory + numeroTramite + "_" + contrato + ".pdf");

            if (file.exists()) {
                stream = new FileInputStream(file);
            } else {
                JsfUtil.addErrorMessage("Error", "No se ha encontrado el archivo");
            }
            this.content = new DefaultStreamedContent(stream, "application/pdf");
        } catch (FileNotFoundException fnfex) {
            JsfUtil.addErrorMessage("Error", "No se ha encontrado el archivo. Error: " + fnfex.getMessage());
            fnfex.printStackTrace();
        } catch (Exception e) {
            JsfUtil.addErrorMessage("Error", "Se ha generado un error al cargar el certificado. Error: " + e.getMessage());
            e.printStackTrace();
        }

        return content;
    }

    public void setCertificado(StreamedContent contenido) {
        content = contenido;
    }

    public Tramite getTramiteSelected() {
        return tramiteSelected;
    }

    public void setTramiteSelected(Tramite tramiteSelected) {
        this.tramiteSelected = tramiteSelected;
    }

    public Integer getNumero() {
        return numeroTramite;
    }

    public void setNumero(Integer numeroTramite) {
        this.numeroTramite = numeroTramite;
    }

    public Integer getContrato() {
        return contrato;
    }

    public void setContrato(Integer contrato) {
        this.contrato = contrato;
    }

}

# View (index.xhtml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:pe="http://primefaces.org/ui/extensions">
    <h:head>
        <title>Consulta de Certificados Digitales</title>
        <h:outputStylesheet library="css" name="epmrpsd.css" />
        <h:outputStylesheet library="webjars" name="font-awesome/5.5.0/css/all-jsf.css" />
        <h:outputStylesheet library="css" name="jsfcrud.css"/>
        <h:outputScript library="js" name="jsfcrud.js"/>
        <link rel="shortcut icon" type="image/png" href="#{resource['images/logo.png']}"/>
    </h:head>
    <h:body>
        <div id="background" style="position: fixed;">
            <h:form id="formCertificados">

                <div class="ui-g" style="margin-top: 25px;">
                    <div class="ui-g-1"></div>
                    <div class="ui-g-10">
                        <p:growl id="mensajes" />

                        <Extra code> ...

                        <p:outputPanel id="pnlCertificado">
                            <p:dataTable id="tramitesTable"
                                         value="#{tramiteController.items}"
                                         var="tramite"
                                         rowKey="#{tramite.id}"
                                         selectionMode="single"
                                         selection="#{tramiteController.selected}"
                                         emptyMessage="No se encontraron trámites con los criterios dados"
                                         rows="10"
                                         rowsPerPageTemplate="10,20,30,40,50">

                                <p:column headerText="Número Trámite" >
                                    <h:outputText value="#{tramite.numero}" />
                                </p:column>

                                <p:column headerText="Descripción" >
                                    <h:outputText value="#{tramite.tipo.descripcion}" />
                                </p:column>

                                <p:column headerText="Número Contrato" >
                                    <h:outputText value="#{tramite.contrato}" />
                                </p:column>

                                <p:column style="text-align: center" headerText="Acción" >
                                    <center>
                                        <p:commandButton id="viewCertificado"
                                                         styleClass="ui-priority-primary"
                                                         value="Ver certificado"
                                                         actionListener="#{documentViewerController.onPrerender(tramite)}"
                                                         update=":ViewCertificadoForm"
                                                         oncomplete="PF('ViewCertificadoDialog').show()" />
                                    </center>
                                </p:column>
                            </p:dataTable>
                        </p:outputPanel>
                    </div>
                    <div class="ui-g-1"></div>
                </div>
            </h:form>

            <ui:include src="ViewCertificado.xhtml"/>
        </div>
    </h:body>
</html>

And the final component for the view is (ViewCertificado.xhtml):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:pe="http://primefaces.org/ui/extensions">

    <ui:composition>

        <p:dialog id="ViewCertificadoDlg"
                  widgetVar="ViewCertificadoDialog"
                  modal="true"
                  resizable="false"
                  appendTo="@(body)"
                  header="Certificado #{documentViewerController.contrato}">
            <h:form id="ViewCertificadoForm">
                <h:panelGroup id="display">
                    <p:panelGrid columns="1" rendered="#{documentViewerController.tramiteSelected != null}">
                        <pe:documentViewer id="certificadoViewer"
                                           height="500px"
                                           width="750px"
                                           cache="false"
                                           value="#{documentViewerController.certificado}"
                                           download="certificado_#{documentViewerController.numero}_#{documentViewerController.contrato}.pdf" />
                    </p:panelGrid>
                    <p:commandButton value="Cerrar" onclick="ViewCertificadoDialog.hide()"/>
                </h:panelGroup>
            </h:form>
        </p:dialog>

    </ui:composition>
</html>