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

Django使用iframe/embed展示PDF出现乱码无法正常显示问题求助

你遇到的乱码是PDF源文件的二进制内容被浏览器识别为纯文本渲染导致的,核心原因是返回PDF的HTTP响应头Content-Type未设置为application/pdf,可按以下步骤排查解决:

1 动态返回PDF的视图配置

如果PDF是通过Django视图动态生成/返回的,修改视图代码,明确指定响应头:

from django.http import HttpResponse
from .models import Packet

def get_certificate_pdf(request, packet_id):
    # 业务逻辑,获取对应的packet对象
    packet = Packet.objects.get(id=packet_id)
    with open(packet.certificate_pdf.path, 'rb') as pdf_file:
        pdf_content = pdf_file.read()
    # 指定content_type为pdf类型
    response = HttpResponse(pdf_content, content_type='application/pdf')
    # inline参数指定浏览器直接预览,若要强制下载可改为attachment
    response['Content-Disposition'] = 'inline; filename="certificate.pdf"'
    return response

模板中embed/iframe的src属性改为对应视图的路由地址即可。

2 静态媒体文件的Web服务器配置

如果生产环境由Nginx/Apache直接Serve存储在媒体目录的PDF文件,需要配置服务器的MIME类型映射:

  • Nginx:在配置文件的http块或站点配置块中添加以下配置,重启Nginx生效
    types {
        application/pdf  pdf;
    }
    
  • Apache:在httpd.conf或站点根目录的.htaccess文件中添加:
    AddType application/pdf .pdf
    

3 验证方法

直接在浏览器地址栏访问PDF的完整URL,打开开发者工具的「网络」面板,查看该请求的响应头,确认Content-Type的值为application/pdf即可。

关于base64方案间歇性失效说明

Chrome 100+版本对iframe中加载的data URI大小做了更严格的限制,体积超过2M的PDF很容易出现随机加载失败的问题,使用URL直连的方案兼容性和稳定性更好。

内容的提问来源于stack exchange,提问作者A. Cloete

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:09:04