返回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
相关产品推荐
相关产品推荐

