Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS设备上的JSF流式PDF_Ios_Jsf - Fatal编程技术网

iOS设备上的JSF流式PDF

iOS设备上的JSF流式PDF,ios,jsf,Ios,Jsf,我有一个JSF页面,它使用支持bean将PDF文档流式传输到浏览器。这个功能非常好用,直到现在在iOS设备上测试这个功能时,我还没有遇到任何问题 在iPad和iPodtouch上的Safari上,当收到响应时,PDF流只是作为不可滚动的层粘贴在网页上。在桌面上的浏览器中,文件会提示保存或打开,并使用Adobe Reader正确打开。这是一个问题,因为iOS设备上只显示PDF第一页的一部分,无法查看其他部分 我已经从网络上测试了这些设备上的其他PDF,它们的行为不一样。启动PDF应用程序或Safa

我有一个JSF页面,它使用支持bean将PDF文档流式传输到浏览器。这个功能非常好用,直到现在在iOS设备上测试这个功能时,我还没有遇到任何问题

在iPad和iPodtouch上的Safari上,当收到响应时,PDF流只是作为不可滚动的层粘贴在网页上。在桌面上的浏览器中,文件会提示保存或打开,并使用Adobe Reader正确打开。这是一个问题,因为iOS设备上只显示PDF第一页的一部分,无法查看其他部分

我已经从网络上测试了这些设备上的其他PDF,它们的行为不一样。启动PDF应用程序或Safari加载可滚动预览,这是所需的结果。还有其他人有这个吗

我的支持bean正在将PDF的缓冲输入流写入输出流。我已设置以下响应标题:

response.setContentType ("application/pdf"); 
response.setContentLength(inputLength); 
response.setHeader ("Content-Disposition", "inline;filename=\"" + saveFilename + ".pdf\""); 
response.setHeader ("Cache-Control", "must-revalidate, post-check=0, pre-check=0, public"); 

我曾尝试将内容配置从内联切换到附件,但没有帮助

我认为这些设备需要服务器端的支持,以便可以在单独的部分请求内容。这最终节省了不必要的网络带宽,并改善了客户端的性能

如果这些PDF是动态生成的,那么最好将它们写入磁盘文件系统中的一个临时位置,并将请求重定向到一个URL,该URL由servlet读取它们。必须有一个物理文件,因为您希望使用它来返回文件的部分内容。此类需要磁盘上的物理磁盘

下面是一个用于创建临时文件并将响应重定向到servlet的示例,其中文件名作为URL参数:

File tempFile = File.createTempFile(saveFilename, ".pdf");
OutputStream output = new FileOutputStream(tempFile);
// Now write PDF to output.
// ...

// Then, redirect to some servlet URL.
String tempFilename = tempFile.getName();
externalContext.redirect("/pdf/" + URLEncoder.encode(tempFilename, "UTF-8"));
然后,您需要一个支持范围请求的servlet。您只需修改它即可将
basePath
值更改为
System.getProperty(“java.io.tmpdir”)
。最后,将这个servlet映射到
/pdf/*
的URL模式上

或者,如果您对服务器拥有完全的管理控制权,那么您还可以创建一个附加的webapp上下文,指向服务器磁盘文件系统上某个位置的绝对路径。例如
/var/webapp/pdf
。例如,在Tomcat中,您可以通过将以下内容添加到
/conf/server.xml
,将其公开:

<Context docBase="/var/webapp/pdf" path="/pdf" />
您不再需要自定义servlet。Tomcat的
DefaultServlet
将正确处理
Range
请求


最后但并非最不重要的一点是,考虑将临时文件存储在会话中,并在会话过期时删除或删除临时文件。我尝试了将文件保存到临时位置的方法,并使用servlet示例创建了一个映射到/pdf/的servlet,然后再次尝试请求。在桌面浏览器上,它按照我的预期进行处理,提示打开或保存。在iOS上的Safari上,它的行为与以前一样,在现有网页上分层PDF,甚至使用response.redirect。我开始认为这是JSF和Safari的一个bug,但我不确定。这些是机密文件,所以我不能只提供文件的直接URL。如果您将静态示例PDF放在公共webcontent中,并直接引用它,以便

DefaultServlet
完成它的工作,会怎么样?是的,它工作得很好。iOS设备打开了它,并将其视为Microsoft Word文档。请调试此文档上的HTTP通信量,好吗?发送和接收了哪些标题和正文?
File tempFile = File.createTempFile(saveFilename, ".pdf", "/var/webapp/pdf");
// ...