如何修改Pandoc Markdown转HTML时用iframe/object替代embed嵌入PDF
Pandoc 自定义PDF嵌入HTML逻辑的实现方案
无需修改Pandoc源码,有三种成熟的简便实现方式,适配不同使用场景:
- 单文件临时修改:直接写原生HTML标签
Pandoc转HTML时会原样保留文档中的原生HTML片段,不需要加任何额外参数,直接在Markdown对应位置插入iframe代码即可:
可以直接给标签加class、写CSS规则实现响应式缩放,完全解决默认<iframe src="example.pdf" width="100%" height="850px" frameborder="0" allowfullscreen> 您的浏览器不支持内嵌PDF预览,请<a href="example.pdf">点击下载文件</a>查看。 </iframe><embed>标签尺寸固定、无法自适应的问题。 - 批量/长期使用:Lua过滤器自动替换
写一个几行代码的Lua过滤器,就能自动替换所有通过Markdown默认图片语法生成的嵌入标签,不需要改动原有Markdown内容。
新建pdf-embed-iframe.lua文件,写入以下代码:
转换时指定过滤器参数即可生效:function Image(elem) if elem.src:sub(-4):lower() == ".pdf" then local iframe = string.format([[ <iframe src="%s" width="100%%" height="850px" frameborder="0" allowfullscreen> 您的浏览器不支持内嵌PDF预览,请<a href="%s">点击下载文件</a>查看。 </iframe> ]], elem.src, elem.src) return pandoc.RawBlock("html", iframe) end end
想让这个规则默认全局生效的话,把过滤器文件放到Pandoc用户数据目录的pandoc input.md -o output.html --lua-filter=pdf-embed-iframe.luafilters子目录下,后续转换HTML时会自动加载,相当于修改了Pandoc的默认处理逻辑。 - 项目级统一规范:自定义HTML模板
如果是固定项目需要统一所有嵌入资源的渲染规则,可以基于Pandoc官方默认HTML模板修改,把PDF嵌入的渲染逻辑替换为自定义的iframe/object实现,后续转换时通过--template参数指定自定义模板即可,适合团队协作的标准化输出场景。
Pandoc默认使用
<embed>标签是出于兼容极老旧浏览器的考虑,目前所有主流现代浏览器对<iframe>嵌入PDF的支持已经非常完善,不存在兼容性问题。
内容的提问来源于stack exchange,提问作者zumdar
相关产品推荐
相关产品推荐

