如何更改由servlet流式传输PDF的浏览器页面的标题?

16

我的基于Java的Web应用程序有一个Servlet,根据请求参数向浏览器流式传输PDF内容。

例如,用户点击一个href为"myApp/FetchPDFServlet?id=123"的A标签。 Servlet映射接受请求,将PDF数据作为mime类型application/pdf流式传输到响应中,并关闭刷新缓冲区。

但是,用于显示PDF的页面的浏览器标题栏显示为“FetchPDFServlet?id=123”。

我该如何更改浏览器显示PDF页面的标题?因此,浏览器标题是“这是惊人的PDF”,而不是“FetchPDFServlet?id=123”。

是否可能做到这一点?最好的方法是什么?

6个回答

8

将以下内容添加到您的HttpServletResponse头部:

response.setHeader("Content-Disposition","inline; filename=Here is the Amazing PDF");

我相信浏览器会自动识别并使用它作为窗口的标题。

ServletResponse response = pageContext.getResponse(); 为什么当我尝试使用类jakarta.servlet.jsp.tagext.TagSupport创建我的标签时,对象response不包含方法setHeader - West Side
@Taylor 使用HttpServletResponse。 - Benson Kiprono

4
您可以在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>

因此,与其使用myApp/FetchPDFServlet?id=123链接到pdf文档,您应该链接到返回上述html的内容。例如,一个jsp页面:myApp/ShowPDF.jsp?id=123&title=Here%20is%20the%20amazing%20PDF


2

我遇到了这个问题,虽然我的解决方案有一些限制,但我还是想分享一下。

基本上,我会在新标签页中打开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 - 表现良好

2
选项卡标题是从PDF文档元数据中获取的,具体来说是Title属性。因此,如果您在应用程序中生成文档,则您的PDF库应该有一种方法来设置文档元数据。

我已经尝试过了。它几乎可以工作。选项卡标题现在是PDF标题(好的)+请求值(不好)。 - M46

0

我找到了一个相当简单的解决方案来解决这个问题。主要部分在于使用/url映射与/fileDownload/*

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

0

我已经尝试了一个Java解决方案,它可以工作。您可以在其他语言中设置给定的标头。

response.setHeader("Content-Disposition","inline; filename=\"MyFile.pdf\"");
response.setContentType("application/pdf; name=\"MyFile.pdf\"");
response.getOutputStream().write(pdfAsBytesArray);

据我所知,Content-Type header 不包含 name 属性。 - naXa stands with Ukraine
2
对我不起作用。选项卡名称始终是请求值的名称,而不是“文件名”的名称。 - M46

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接