我正在使用流式<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>
感谢您的时间。
答案 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&v=6.1&pfdrid=8881a099cd5419259117729be00f4824&pfdrt=sc&pfdrid_c=false&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&v=6.1&pfdrid=a754229fe5cdabff72537ef0693a2399&pfdrt=sc&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&v=6.1&pfdrid=a754229fe5cdabff72537ef0693a2399&pfdrt=sc&title=Test.pdf&pfdrid_c=true"
height="600px" width="1100px" internalinstanceid="6">
<param name="title" value="Test.pdf">
</object>
这只适用于StreamedContent
。以下是pdf标题的屏幕截图。
请注意,“。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" />