You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

返回FileResponse时,如何设置PDF新标签页的标题?

解决PDF新标签页标题显示元数据而非文件名的问题

问题分析

浏览器直接打开PDF时,会优先读取PDF文件内部的文档标题元数据来设置标签页标题,并不会采用Content-Disposition响应头里的文件名。要让标签页显示指定的文件名,需要绕开这个默认行为。

解决方案一:前端控制新标签页标题(推荐,无需修改PDF)

修改前端点击事件,先打开空白标签页并设置好标题,再加载PDF文件:

<input type="button" onclick="openPdfWithCustomTitle();" value="Show File"/>
<script>
function openPdfWithCustomTitle() {
    // 打开空白标签页
    const newTab = window.open('', '_blank');
    // 设置标签页标题为目标文件名
    newTab.document.title = 'Generated.pdf';
    // 加载PDF文件
    newTab.location.href = "{% url 'get_file' %}";
}
</script>

如果文件名需要从后端动态获取,可以通过模板变量传递:

<input type="button" onclick="openPdfWithCustomTitle('{{ filename }}');" value="Show File"/>
<script>
function openPdfWithCustomTitle(filename) {
    const newTab = window.open('', '_blank');
    newTab.document.title = filename;
    newTab.location.href = "{% url 'get_file' %}";
}
</script>

解决方案二:后端修改PDF元数据

如果必须让PDF本身的元数据匹配文件名,可以使用PyPDF2库修改PDF的文档标题:

首先安装依赖:

pip install PyPDF2

修改后端views.py代码:

from PyPDF2 import PdfReader, PdfWriter
import io
import os

def GetFile(request):
    filepath = os.path.join('my_path', variable, filename)
    # 读取PDF并修改元数据
    reader = PdfReader(filepath)
    writer = PdfWriter()
    writer.append_pages_from_reader(reader)
    # 将文档标题设置为目标文件名
    writer.add_metadata({"/Title": filename})
    # 将修改后的PDF写入内存流
    output_stream = io.BytesIO()
    writer.write(output_stream)
    output_stream.seek(0)
    # 返回响应
    response = FileResponse(output_stream, content_type='application/pdf')
    response['Content-Disposition'] = 'filename="{}"'.format(filename)
    return response

注意事项

  • 方案一无需修改PDF文件,实现简单,适合大多数场景;
  • 方案二需要额外处理PDF文件,适合必须保证PDF元数据与文件名一致的场景;
  • 确保后端传递的filename变量是正确的目标文件名(如Generated.pdf)。

内容的提问来源于stack exchange,提问作者user1336827

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:15:33