默认标题p:带有pdf播放器的媒体

时间:2017-06-06 14:44:52

标签: pdf primefaces media lightbox

我正在使用流式<p:lightBox><p:media>进行编程,以预览外部PDF。

它工作正常,但我有点障碍。

当呈现pdf对话框时,它显示(在鼠标悬停时)一个Header,它始终显示相同的标题:&#34; dynamiccontent.properties&#34;。

是否有可以覆盖的属性或其他内容来自定义它?

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

感谢您的时间。

3 个答案:

答案 0 :(得分:2)

这似乎是Primefaces中的一个错误。 Checkout Primefaces版本6.1,因为他们似乎解决了这个问题here。 然后,在DefaultStreamedContent中设置内容名称

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

我在{xhtml中的<p:media>

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

渲染的<p:media>看起来像这样:

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

然后,Chrome中的pdf查看器标题和下载文件名都是&#34; document.pdf&#34;。

答案 1 :(得分:1)

使用Google Chrome时遇到了同样的问题 标题不会出现在IE 11中。
(我只使用IE 11和谷歌浏览器,因此我不知道其他浏览器的外观)

这是具有流值的呈现media的样子:

<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来自DynamicContentSrcBuilder#build(resourcePath)

我试过了:

1。DefaultStreamedContent

中设置名称
new DefaultStreamedContent(getData(), "application/pdf", "test.pdf");

这似乎不起作用。名称在MediaRenderer#encodeEnd中变为空,因此该名称未添加到src

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

2. 覆盖MediaRenderer#encodeEnd并添加固定值名称(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());
}

这也行不通。 lightBox打开但无法显示pdf文件。

3。覆盖MediaRenderer#encodeEnd并替换src中“dynamiccontent.properties”的值 使用title中的值,该值在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看起来像这样。

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

这只适用于StreamedContent。以下是pdf标题的屏幕截图。

enter image description here

请注意,“。xhtml”需要。没有它,它将无法运作。

希望这有帮助。

答案 2 :(得分:0)

这种情况只是因为DefaultStreamedContent丢失了文件的属性,这意味着标题和名称。

必须使用servlet来设置标头,contenttype和文件名。虽然它正在下载:

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

 }

该方法可以通过这种方式,使用@webservlet调用声明名称的servlet:

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

该视图适用于primeface的组件:<p:media />

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