标签嵌入 pdf 失败主因是 cors 配置缺失、type="application/pdf" 未声明及移动端 safari 不支持;需服务端设置 access-control-allow-origin、确保 content-type 正确,并优先用 或 pdf.js 兼容处理。

<embed></embed> 标签确实能快速把 PDF 嵌入网页,但实际用起来经常白屏、报错或根本不加载——根本原因不是写法错了,而是浏览器策略和 PDF 服务端配置没对上。
PDF 文件必须支持跨域(CORS),否则 Chrome/Firefox 直接拒绝加载
本地双击 HTML 打开时,<embed src="xxx.pdf"></embed> 看似能工作,但一旦部署到服务器(哪怕 localhost:8080),90% 的失败都源于 PDF 响应头缺失 Access-Control-Allow-Origin。
- 检查方法:打开 DevTools → Network → 点击 PDF 请求 → 查看 Response Headers 是否含
Access-Control-Allow-Origin: *或对应域名 - Nginx 配置示例:
add_header 'Access-Control-Allow-Origin' '*';(开发环境可用,生产请限定域名) - Apache 需启用
mod_headers并加Header set Access-Control-Allow-Origin "*" - 静态托管平台(如 GitHub Pages、Vercel)默认不支持添加响应头,此时
<embed></embed>基本不可用
<embed></embed> 的 type 属性不是可选的,必须显式声明 application/pdf
省略 type 或写成 text/pdf、pdf 等非标准值,会导致 Safari 完全不渲染,Edge 回退为下载链接。
- 正确写法:
<embed src="manual.pdf" type="application/pdf" width="100%" height="600px"></embed> - 不要依赖 MIME 自动识别:浏览器不会主动探测 PDF 文件头来补全类型
- 如果后端返回的 PDF 响应头中
Content-Type不是application/pdf,<embed></embed>也会失效(即使type属性写对了)
移动端 Safari 和部分安卓 WebView 完全忽略 <embed></embed>,必须降级处理
iOS 上无论你怎么配,<embed></embed> 在 Safari 中大概率显示为空白或提示“无法预览”。这不是 bug,是 Apple 明确不支持内联 PDF 渲染(只允许通过 <iframe></iframe> 调用系统预览)。
- 兼容方案:优先用
<iframe src="xxx.pdf"></iframe>,它在 iOS 上会触发系统 PDF 查看器 - 但注意:
<iframe></iframe>同样受 CORS 限制;若 PDF 不同源且无响应头,会显示空白或 404 - 更稳妥的做法是服务端生成带 token 的直链,或用 PDF.js 做纯前端解析(避开所有跨域和浏览器限制)
真正卡住人的从来不是怎么写那一行 <embed></embed>,而是搞不清请求路径是否被代理重写、PDF 是否被 CDN 缓存了旧响应头、或者开发机上测试正常上线就崩——这些细节不逐层验证,光调标签属性没用。











