跳到主要内容

使用简单方法在 Markdown 中展示 PDF 文件

2026.6.18

纯原生方案

Markdown 支持 html 元素 可以使用 iframe 或者 object 来显示网页
再配合上浏览器自带的 PDF 预览功能即可实现在 Markdown 文件中放置一个或多个 PDF 预览

使用 iframe 元素

示例:


<details>

<summary>PDF 文件预览</summary>

<p>如果您的浏览器不支持 PDF 预览,请 <a href="/file.pdf">点击此处下载</a>。</p>

<iframe src="/files/example.pdf" loading="lazy" width="100%" height="600px">
</iframe>

</details>

使用 details 元素使 iframe 折叠 避免内容过长影响阅读
通过 loading="lazy" 让其在折叠时不被加载以节约资源

不支持 PDF 预览的提示应该加在 iframe 的外部 details 的内部
如果写在 iframe 内部 那么只有在浏览器 不支持 iframe 时才会显示提示
当 iframe 指向内容无法加载时 这些提示是无法显示的

使用 object 元素

使用 object 元素和 iframe 的方法差不多

示例:


<details>

<summary>PDF 文件预览</summary>

<p>如果您的浏览器不支持 PDF 预览,请 <a href="/file.pdf">点击此处下载</a>。</p>

<object data="/file.pdf" type="application/pdf" width="100%" height="500px">
</object>

</details>

object 原生支持显示替代文本显示 不过其应该只有在收到的媒体类型与 type 设置不符时才会生效
其不支持 loading="lazy" 即处于折叠状态依然会加载

小结

使用 iframe 和 object 元素外加 浏览器自带的 PDF 预览功能
即可较为简单的实现在 markdown 中展示 PDF 文件

不过这个原生方案的局限性很大
其完全依赖浏览器的 PDF 预览功能 若浏览器不支持则完全无法显示
在有些浏览器中还会触发自动下载 用户体验较差


第三方 PDF 渲染器

使用第三方 PDF 渲染器可以有效的减少对浏览器自身 PDF 功能的依赖
具有更强的兼容性 其基本由 js 脚本驱动 受浏览器和系统平台的影响较小

本地托管

即将 PDF 渲染器与网站文件放置在一起
这里使用的是的 Mozilla 的 PDF.js 建议使用带 legacy 的版本 以提高兼容性

下载压缩包后解压缩 若使用 静态站点生成器(SSG)一般会有一个 static 文件夹
在生成站点时 不会对其中的内容进行处理 将插件放在其中即可

其中有一个 web 文件夹 内含 viewer.html 这个就是 PDF 预览页面
调用方法就是在请求这个 html 文件的后面 加上需要显示的 PDF 文件名称即可

示例: /pdfjs-legacy/web/viewer.html?file=123.pdf
可以先使用绝对路径在浏览器中打开 确定显示正常后再填入 iframe 中
实际使用时应采用相对路径 包括后面的 PDF 文件路径

值得注意的是在写 PDF 文件的相对路径时应优先使用 / 而不是 ../
因为此处是以 viewer.html 的路径为基础
使用 ../ 所得到的是 viewer.html 上级目录 用 / 从根目录开始会更简单

由于其依赖 js 脚本 当浏览器禁用 JavaScript 后无法正常显示 PDF文件内容
但能显示 viewer.html 上阅读器的基础内容 使得用户较难辨别目标内容是否正常加载

可以通过放置 noscript 元素来解决此问题
在启用 JavaScript 的情况下 noscript 所包裹的内容不会被显示
我们可以将警告信息放置在其中 使其在 js 脚本被禁用时显示

示例:


<noscript>
<strong><mark>警告 JavaScript 已经禁用 PDF 预览将不会加载</mark></strong>
</noscript>

这里还使用了 strong 和 mark 元素对提示信息进行加粗和高亮
其胜在书写简单 不用写 class 和内联 style
当然要是希望其有更好的呈现效果 还是需要通过 CSS 来实现

最终组合:

<details>

<summary>PDF 文件预览</summary>

<p>如果预览无法加载请 <a href="/file.pdf">点击此处下载文件</a>。</p>

<noscript>
<strong><mark>警告 JavaScript 已经禁用 PDF 预览将不会加载</mark></strong>
</noscript>

<iframe width="100%" height="600px" loading="lazy" src="/pdfjs-legacy/web/viewer.html?file=/file.pdf" >
</iframe>

</details>

截图

normal noscript

使用在线服务

使用在线的文档展示服务和地托管差不多 只是将请求地址转移到了外部站点上
而且 PDF 文件的地址必须是可被访问的绝对地址

优点是不需要在自己的站点上添加新的内容
缺点也很明显 预览文件需要写绝对地址 未来迁移时需要进行地址替换
用户不一定能连接上这些服务器 而且这些服务未来也可能发生变化

可以直接使用 PDF.js 的官方服务 不过其所提供版本较新
使用了很多 js 新特性和新方法 旧的浏览器不一定支持
地址:https://mozilla.github.io/pdf.js/web/viewer.html

谷歌的 Google Docs Viewer 也不错 不仅能预览 PDF 文件 大部分常见的文件类型其实都可以预览
功能是十分强大的 就是连通性会差一些 地址:https://docs.google.com/viewer?url=文件的绝对路径&embedded=true
如果不需要使用 iframe 进行嵌入的话 后面的 &embedded=true 可以不要

微软的 Office Web Viewer 似乎并不支持 PDF
但是用来预览 word 文档 幻灯片和 Excel 表格还是不错的
地址:https://view.officeapps.live.com/op/view.aspx?src=文档绝对路径

此部分参考:embedded-file-viewer.md


转换成位图

上述的这些方案主要适用于自建站点 如果 markdown 文件发布于托管平台
在一般情况下出于安全性考虑 平台的解析器会忽略这些元素
不会将其转换成对应的 html 内容 多以纯文本的形式呈现

想要在这些平台上显示 PDF 文件的内容 唯一可行的方法恐怕就是将 PDF 转换成图片加以展示
对较短的文件来说可以转换成一张完整的图片 较长时应按照页数分成多张
最好再添加一个用于下载原始 PDF 文件的超链接