Java 如何更改servlet将PDF传输到的浏览器页面的标题?
我的基于Java的webapp有一个servlet,它根据请求参数将PDF内容流回到浏览器 e、 g.用户单击href为“myApp/FetchPDFServlet?id=123”的A标记。Servlet映射接收请求,将PDF数据流作为mime类型的应用程序/PDF响应,关闭刷新缓冲区 但是,显示PDF的页面的浏览器标题栏显示“FetchPDFServlet?id=123” 如何更改浏览器为显示PDF的页面显示的标题? 因此,浏览器标题是“这是惊人的PDF”,而不是“FetchPDFServlet?id=123”Java 如何更改servlet将PDF传输到的浏览器页面的标题?,java,pdf,browser,servlets,titlebar,Java,Pdf,Browser,Servlets,Titlebar,我的基于Java的webapp有一个servlet,它根据请求参数将PDF内容流回到浏览器 e、 g.用户单击href为“myApp/FetchPDFServlet?id=123”的A标记。Servlet映射接收请求,将PDF数据流作为mime类型的应用程序/PDF响应,关闭刷新缓冲区 但是,显示PDF的页面的浏览器标题栏显示“FetchPDFServlet?id=123” 如何更改浏览器为显示PDF的页面显示的标题? 因此,浏览器标题是“这是惊人的PDF”,而不是“FetchPDFServle
有可能吗?如何最好地做到这一点?您可以在iframe中显示PDF。
大概是这样的:
<html>
<head>
<title>Here is the amazing PDF</title>
<style type="text/css">
html, body, div, iframe { margin:0; padding:0; height:100%; }
iframe { display:block; width:100%; border:none; }
</style>
</head>
<body>
<iframe width="100%" length="100%" src="myApp/FetchPDFServlet?id=123"/>
</body>
</html>
这是令人惊奇的PDF
html,body,div,iframe{margin:0;padding:0;height:100%;}
iframe{显示:块;宽度:100%;边框:无;}
因此,与使用myApp/FetchPDFServlet?id=123链接到pdf文档不同,您可以链接到返回上述html的内容。例如,一个jsp页面:
myApp/ShowPDF.jsp?id=123&title=Here%20是%20惊人的%20PDF
将此标题添加到您的HttpServletResponse中:
response.setHeader("Content-Disposition","inline; filename=Here is the Amazing PDF");
我相信浏览器会选择它并将其用作窗口标题。我遇到了这个问题,虽然我的解决方案有很多限制,但我想我会分享它 我将在一个新的选项卡中打开pdf,然后从原始页面更改其标题
$('#aa').click(function(){
ref = window.open('resume.pdf','mywindow');
ref.onload = function(){
ref.document.title="New Title";
}
return false;
});
});
请注意,父页面和子页面必须位于同一域中
我已经在一些浏览器中对此进行了测试,结果如下:
- Chrome 10-效果非常好
- Safari 5-工作正常,但默认情况下会在新窗口中打开,而不是在选项卡中打开。用户可以更改此选项以在选项卡中打开所有新窗口
- IE 8-不起作用,如预期:op
- Firefox-工作起来就像一种享受
response.setHeader("Content-Disposition","inline; filename=\"MyFile.pdf\"");
response.setContentType("application/pdf; name=\"MyFile.pdf\"");
response.getOutputStream().write(pdfAsBytesArray);
选项卡标题取自PDF文档元数据,特别是标题属性。因此,如果您在应用程序中生成文档,您的PDF库应该有一种方法来设置文档元数据。我找到了一种解决此问题的简单方法。这里的主要部分是带有/fileDownload的url映射/*
@WebServlet(urlPatterns = { "/fileDownload/*" })
@Slf4j
public class FileDownloadServlet extends HttpServlet
{
@Inject
private SimpleDocumentStoreService documentService;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
{
String id = req.getParameter("id");
if (StringUtils.isNotEmpty(id))
{
try
{
documentService.streamDatei(id, resp);
resp.flushBuffer();
} catch (IOException e)
{
log.error("error downloading file", e);
}
}
}
}
打电话的人:
<a href="#{request.contextPath}/fileDownload/#{document.name}?id=#{document.id}" target="_blank">
<h:outputText value="#{document.name}"/>
</a>
AFAIK不包含name
属性。不适用于我。选项卡名称始终是请求值的名称,而不是“文件名”的名称。我已经尝试过了。它几乎成功了。选项卡标题现在是pdf标题(好)+请求值(坏)。