2017-06-06 2 views
1

Je suis en train de programmer un <p:lightBox> avec un <p:media> streamé pour prévisualiser des PDF externes.En-tête par défaut p: support avec lecteur pdf

Cela fonctionne bien mais je reçois un petit handicap. Lorsque la boîte de dialogue pdf est affichée, elle affiche (avec le pointeur de la souris) un en-tête où elle affiche toujours le même titre: "dynamiccontent.properties".

Existe-t-il un attribut ou un élément que je peux remplacer pour le personnaliser?

code JSP:

<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

Merci pour votre temps.

Répondre

0

J'ai rencontré le même problème lors de l'utilisation de google chrome.
L'en-tête ne figure pas dans IE 11.
(je suis seulement en utilisant IE 11 et Google Chrome donc je ne sais pas à quoi cela ressemble d'autres navigateurs)

C'est ce qu'un rendu media avec valeur en flux continu ressemblera:

<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 vient de DynamicContentSrcBuilder#build(resourcePath)

J'ai essayé:

1. réglage du nom dans DefaultStreamedContent

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

cela ne semble pas fonctionner. le nom devient nul dans MediaRenderer#encodeEnd donc le nom n'est pas ajouté dans le src.

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

2. override MediaRenderer#encodeEnd et ajouter un nom de valeur fixe (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()); 
} 

Cela n'a pas non plus travaillé. La lightBox s'ouvre mais ne peut pas afficher le fichier pdf.

3. override MediaRenderer#encodeEnd et remplacer la valeur de « dynamiccontent.properties » dans le src avec la valeur de title qui est mis en XHTML.

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> 

redered media ressemblera à quelque chose comme ça.

<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> 

Cela fonctionne uniquement sur StreamedContent. Voici une capture d'écran de l'en-tête pdf.

enter image description here

Notez que "xhtml" est nécessaire . Ça ne marchera pas sans ça.

Espérons que cela aide.

+0

Merci pour votre réponse. J'ai cherché un peu plus et j'ai trouvé une autre solution qui garde le code très propre. Le tag 'documentViewer'. c'est une extension pour les primitifs et fonctionne très bien. Merci encore. –

0

Cela semble être un bug dans Primefaces. Checkout Primefaces version 6.1 car ils semblent avoir corrigé ce problème here. Ensuite, définir le nom contenu dans DefaultStreamedContent fonctionne

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

Mon <p:media> en xhtml:

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

Et le rendu <p:media> ressemble à ceci:

<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> 

Ensuite, à la fois le titre de visionneuse pdf et le nom du fichier de téléchargement dans Chrome est "document.pdf".

+0

Upvoted, merci d'ajouter ceci ici. Informations utiles – Kukeltje

0

Cela s'est produit juste parce que le DefaultStreamedContent a perdu la propriété du fichier, cela signifie Titre et nom.

Il faut utiliser une servlet pour définir l'en-tête, le type de contenu et le nom du fichier. alors qu'il est 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(); 
     } 
    } 

} 

La méthode pourrait être de cette façon, le servlet avec le nom déclaré qu'il est invoqué avec @webservlet:

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

La vue fonctionne avec le composant primeface's: <p:media />:

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

_ "Il faut utiliser une servlet pour définir l'en-tête, le type de contenu et le nom du fichier." _ Non non vrai, voir l'autre réponse upvoted ... – Kukeltje