2017-06-06 2 views
1

Ich programmiere eine <p:lightBox> mit einem gestreamten <p:media>, um externe PDFs vorzusehen.Standardkopfzeile p: Medien mit pdf Spieler

Es funktioniert gut, aber ich bekomme ein kleines Handicap.

Wenn der PDF-Dialog gerendert wird, zeigt er (mit der Maus darüber) eine Kopfzeile, wo immer derselbe Titel angezeigt wird: "dynamiccontent.properties".

Gibt es ein Attribut oder etwas, das ich außer Kraft setzen kann, um es anzupassen?

JSP-Code:

<p:lightBox> 
    <h:outputLink value="#" title="#{myDoc.fileName}"> 
    <i class="fa fa-eye" aria-hidden="true"></i> 
    </h:outputLink> 

    <f:facet name="inline"> 
    <p:media value="#{documentController.stream}" width="1100px" height="600px" player="pdf"> 
     <f:param name="idStore" value="#{myDoc.idStore}" /> 
    </p:media> 
    </f:facet> 
</p:lightBox> 

Displayed header for a PDF

Vielen Dank für Ihre Zeit.

Antwort

0

Ich habe das gleiche Problem bei der Verwendung von Google Chrome gefunden.
Der Header in IE nicht erscheint 11.
(Ich verwende nur IE 11 und Google Chrome, damit ich weiß nicht, was das ist wie auf anderen Browser aussieht)

Dies ist, was mit einem eine gerenderte media gestreamten Wert wird wie folgt aussehen:

<object type="application/pdf" 
    data="/projectName/javax.faces.resource/dynamiccontent.properties.xhtml?ln=primefaces&amp;v=6.1&amp;pfdrid=a754229fe5cdabff72537ef0693a2399&amp;pfdrt=sc&amp;pfdrid_c=true" 
    height="600px" width="1100px" internalinstanceid="6"> 
</object> 

/projectName/javax.faces.resource/dynamiccontent.properties.xhtml von DynamicContentSrcBuilder#build(resourcePath) kommt

ich habe versucht:

1. Einstellung Name in DefaultStreamedContent

new DefaultStreamedContent(getData(), "application/pdf", "test.pdf"); 

dies nicht zu funktionieren scheint. name wird null in MediaRenderer#encodeEnd, so dass der Name nicht in src hinzugefügt wird.

if (streamedContent.getName() != null) { 
    int index = src.indexOf("?"); 
    src = src.substring(0, index) + ";/" + streamedContent.getName() + "" 
     + src.substring(index, src.length()); 
} 

2. Überschreibung MediaRenderer#encodeEnd und fügen Sie einen festen Wert Name (Test.pdf)

if ((value != null) && (value instanceof StreamedContent) && (player.getType().equals("application/pdf"))) { 
    streamedContent = (StreamedContent) value; 
    if (streamedContent.getName() != null) { 
     int index = src.indexOf("?"); 
     src = src.substring(0, index) + ";/" + streamedContent.getName() + "" 
       + src.substring(index, src.length()); 
    } 

    src = src.substring(0, index) + ";/Test.pdf" 
       + src.substring(index, src.length()); 
} 

Das hat auch nicht funktioniert. Die lightBox öffnet sich, kann aber die PDF-Datei nicht anzeigen.

3.MediaRenderer#encodeEnd Überschreibung und den Wert von "dynamiccontent.properties" ersetzt im src mit dem Wert aus, der in title xhtml eingestellt ist.

Mediarenderer # encodeEnd

if ((value != null) && (value instanceof StreamedContent) && (player.getType().equals("application/pdf"))) { 
    streamedContent = (StreamedContent) value; 
    if (streamedContent.getName() != null) { 
     int index = src.indexOf("?"); 
     src = src.substring(0, index) + ";/" + streamedContent.getName() + "" 
       + src.substring(index, src.length()); 
    } 

    if (src.contains("dynamiccontent.properties")) { 
     String[] urlParams = src.split("&"); 

     for (String param : urlParams) { 
      if (param.contains("title=")) { 
       String[] titleAndValue = param.split("="); 
       src = src.replace("dynamiccontent.properties", titleAndValue[1]); 
      } 
     } 
    } 
} 

xhtml

<p:lightBox> 
    <h:outputLink value="#" title="#{myDoc.fileName}"> 
     <i class="fa fa-eye" aria-hidden="true"></i> 
    </h:outputLink> 

    <f:facet name="inline"> 
     <p:media value="#{documentController.stream}" width="1100px" height="600px" player="pdf"> 
      <f:param name="title" value="Test.pdf" /> 
     </p:media> 
    </f:facet> 
</p:lightBox> 

media redered etwas wie folgt aussehen.

<object type="application/pdf" 
    data="/projectName/javax.faces.resource/Test.pdf.xhtml?ln=primefaces&amp;v=6.1&amp;pfdrid=a754229fe5cdabff72537ef0693a2399&amp;pfdrt=sc&amp;title=Test.pdf&amp;pfdrid_c=true" 
    height="600px" width="1100px" internalinstanceid="6"> 
    <param name="title" value="Test.pdf"> 
</object> 

Dies funktioniert aber nur auf StreamedContent. Folgendes ist ein Screenshot des PDF-Headers.

enter image description here

Beachten Sie, dass ".xhtml" ist erforderlich. Ohne sie geht es nicht.

Hoffe, das hilft.

+0

Danke für Ihre Antwort. Ich habe ein wenig mehr gesucht und eine andere Lösung gefunden, die den Code sehr sauber hält. Der Tag "documentViewer". es ist eine Erweiterung für Hauptoberflächen und funktioniert sehr gut. Noch einmal Danke. –

0

Dies scheint ein Bug in Primefaces zu sein. Überprüfen Sie Primefaces Version 6.1, wie sie dieses Problem here behoben scheinen. Dann in DefaultStreamedContent den Inhalt Name Einstellung arbeitet

new DefaultStreamedContent(pdfData(), "application/pdf", "document.pdf"); 

Mein <p:media> in xhtml:

<object type="application/pdf" 
     data="/javax.faces.resource/dynamiccontent.properties;/document.pdf?ln=primefaces&amp;v=6.1&amp;pfdrid=8881a099cd5419259117729be00f4824&amp;pfdrt=sc&amp;pfdrid_c=false&amp;uid=f6c9ade9-4d7b-47ab-832f-19b119e6cd58" 
     internalinstanceid="9" title=""> 
</object> 

dann sowohl die PDF-Viewer Titel:

<p:media value="#{pdfViewerController.fileStream}" player="pdf" cache="false" /> 

Und das gerenderte <p:media> wie folgt aussieht Der Name der Download-Datei in Chrome lautet "document.pdf".

+0

Upvoted, danke, dass du das hier hinzugefügt hast. Nützliche Informationen – Kukeltje

0

Dies ist nur passiert, weil der DefaultStreamedContent die Properties der Datei verloren hat, also Titel und Name.

Es muss ein Servlet verwendet werden, um die Kopfzeile, den Inhaltstyp und den Dateinamen festzulegen. während es downloaging:

import java.io.File; 
import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

import javax.annotation.Resource; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

@WebServlet("/pdf/*") 
public class ServletPdf extends HttpServlet { 

private static final long serialVersionUID = 8401022908619069931L; 

String fileDirectory = "C:/directory"; 

@Override 
protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) { 
    String fileName, filePath, absolutePath; 
    Path path; 
    try { 
     String requestedFile = request.getPathInfo().substring(1); 
     if (requestedFile == null) { 
      response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404. 
      return; 
     } 
     requestedFile = fileDirectory + File.separator + requestedFile; 

     path = Paths.get(requestedFile); 
     fileName = path.getFileName().toString(); 
     absolutePath = path.toAbsolutePath().toString(); 
     filePath = absolutePath.substring(0, 
       absolutePath.lastIndexOf(File.separator)); 
     File file = new File(filePath, fileName); 

     if (!file.exists()) { 
      response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404. 
      return; 
     } 

     String contentType = getServletContext() 
       .getMimeType(file.getName()); 
     if (contentType == null || !contentType.startsWith("application")) { 
      response.sendError(HttpServletResponse.SC_NOT_FOUND); 
      return; 
     } 

     response.reset(); 
     response.setContentType(contentType); 
     response.setHeader("Content-Length", String.valueOf(file.length())); 

     Files.copy(file.toPath(), response.getOutputStream()); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

} 

Verfahren auf diese Weise sein könnten, es mit @webservlet aufgerufen wird das Servlet mit dem angegebenen Namen:

import java.io.File; 
import java.io.Serializable; 

import org.springframework.stereotype.Controller; 

@Controller("mbPdf") 
public class mbPdfFile implements Serializable(){ 

private static final long serialVersionUID = 8817606290129899111L; 

String fileDirectory = "C:/directory"; 
String filePath = "resources/pdf"; 
String fileName = "testPdf.pdf"; 

public String filePathComplete() { 
    String path = fileDirectory + File.separator + filePath 
      + File.separator + fileName; 
    File pdf = new File(path); 
    if (pdf.exists()) { 
     path = "/pdf//" + filePath + File.separator + fileName; 
    } else { 
     // Information message 
    } 
    return path; 
    } 
} 

Die Ansicht mit der primeface's Komponente funktioniert: <p:media />:

<p:media id="pdf" value="#{mbPdf.filePathComplete()}" 
     width="80%" height="800" /> 
+0

_ "Es muss ein Servlet verwendet werden, um den Header, den Inhaltstyp und den Namen der Datei zu setzen." _ Nein, nicht wahr, siehe die andere upvoted Antwort ... – Kukeltje