【问题标题】:Message: Missing PDF in PrimeFaces Extensions DocumentViewer消息:PrimeFaces Extensions DocumentViewer 中缺少 PDF
【发布时间】:2019-01-28 12:26:46
【问题描述】:

这是我的代码 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}"/>      

错误:--PDF.js v1.0.21 (build: f954cde) 消息:缺少 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”。

【问题讨论】:

  • 请检查服务器端日志,应该有异常,可能文件丢失/长度为零/您没有打开它的读取权限。另一个可能的原因是您提供了非法文件名(“AFC150_20180819_0103”而不是“AFC150_20180819_0103.pdf”)并且可能 PDF.js 无法理解它。
  • @Vasu Sharma 在下面我的帮助下您能解决您的问题吗?

标签: java jsf primefaces primefaces-extensions


【解决方案1】:

使用流式内容时,您没有正确使用组件,它不是“url=”而是“value=”。 URL 属性仅在指向文档时使用。您正在尝试流式传输内容。

这是你应该拥有的......

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

【讨论】:

    【解决方案2】:

    我试过这个:

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

    在bean(类)代码处:

    @ManagedBean
    @ApplicationScoped
    public class DocumentViewerController {
    

    范围是@ApplicationScoped。我有一个私有的 StreamedContent 属性。以及两个主要的公共方法:

    第一种方法:p:commandButton的actionListener属性调用。该方法接收一个参数(在我的例子中)。

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

    第二种方法:它是在对话框组件中的 pe:documentViewer 中使用的,如下所示:

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

    注意:第二种方法就像一个属性(getter 和 setter)。这就是诀窍。

    我项目的最终代码是:

    # 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;
        }
    
    }
    

    #视图(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>
    

    视图的最后一个组件是(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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 2016-10-08
      • 1970-01-01
      • 2016-08-07
      相关资源
      最近更新 更多