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

时间:2009-06-29 15:34:59

标签: java pdf browser servlets titlebar

我的基于Java的webapp有一个servlet,它根据请求参数将PDF内容流回浏览器。

e.g。用户点击href为“myApp / FetchPDFServlet?id = 123”的A标签。 Servlet映射获取请求,将PDF数据流式传输到响应为mime-type application / pdf,关闭刷新缓冲区。

然而,显示PDF的页面的浏览器标题栏显示为“FetchPDFServlet?id = 123”

如何更改浏览器为显示PDF的页面显示的标题? 所以浏览器标题是“这里是令人惊叹的PDF”而不是“FetchPDFServlet?id = 123”。

有可能吗?怎么做到最好?

6 个答案:

答案 0 :(得分:7)

将此标题添加到您的HttpServletResponse:

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

我相信浏览器会把它拿起并用作窗口的标题。

答案 1 :(得分: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 :(得分:2)

我遇到了这个问题,虽然我的解决方案有很多限制,但我认为我会分享它。

Baiscally我会在新标签页中打开pdf,然后从原始页面更改标题。

$('#aa').click(function(){
    ref = window.open('resume.pdf','mywindow');     
    ref.onload = function(){
        ref.document.title="New Title";
    }
    return false;
    });
  });

请注意,父页面和子页面必须位于同一个域中。

我在几个浏览器中对此进行了测试,结果如下:

  • Chrome 10 - 就像一种享受
  • Safari 5 - Works,但默认情况下会在新窗口中打开而不是标签。用户可以更改此选项以打开选项卡中的所有新窗口。
  • IE 8 - 按预期不起作用:op
  • Firefox - 就像一种享受

答案 3 :(得分:1)

标签标题取自PDF文档元数据,特别是Title属性。因此,如果您在应用中生成文档,则PDF库应该有一种设置文档元数据的方法。

答案 4 :(得分:0)

我在java中尝试过一个解决方案,但它确实有效。您可以使用其他语言设置指定的标题

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

答案 5 :(得分:0)

我找到了一个相当简单的解决方案。这里的主要部分是与 /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>