Java 如何更改servlet将PDF传输到的浏览器页面的标题?

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

我的基于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”


有可能吗?如何最好地做到这一点?

您可以在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-工作起来就像一种享受

我用java尝试了一个解决方案,效果很好。您可以用其他语言设置给定的标题

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标题(好)+请求值(坏)。