16

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

例如,用户单击带有“myApp/FetchPDFServlet?id=123”href 的 A 标记。Servlet 映射获取请求,将 PDF 数据流式传输到作为 mime 类型应用程序/pdf 的响应,关闭刷新缓冲区。

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

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

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

4

6 回答 6

8

将此标头添加到您的 HttpServletResponse:

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

我相信浏览器会选择它并将其用作窗口的标题。

于 2009-06-29T19:44:50.273 回答
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>

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

于 2009-06-29T16:30:11.903 回答
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 - 有效,但默认情况下在新窗口中打开而不是选项卡。用户可以更改它以在选项卡中打开所有新窗口。
  • IE 8 - 无法正常工作:op
  • Firefox - 像款待一样工作
于 2011-01-24T11:43:57.513 回答
2

选项卡标题取自 PDF 文档元数据,特别是 Title 属性。因此,如果您在应用程序中生成文档,您的 PDF 库应该可以设置文档元数据。

于 2017-01-17T23:03:20.957 回答
0

我在java中尝试了一个解决方案并且它有效。您可以用其他语言设置给定的标题

response.setHeader("Content-Disposition","inline; filename=\"MyFile.pdf\"");
response.setContentType("application/pdf; name=\"MyFile.pdf\"");
response.getOutputStream().write(pdfAsBytesArray);
于 2015-07-02T10:59:11.880 回答
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>
于 2021-02-15T10:40:25.427 回答