非Markdown格式输入时如何向Pandoc传递元数据?以HTML为例
解决Pandoc非Markdown输入(如HTML)传递元数据的问题
这个坑我之前踩过好几次,确实HTML这类非Markdown输入下,直接加YAML元数据块容易被当成普通内容解析,下面给你几个实用的解决思路:
1. 用--metadata或--metadata-file参数(最推荐)
这是最灵活可靠的方式,完全不需要修改输入文件本身:
- 传递单个元数据:
pandoc --from=html --to=pdf --metadata title="我的文档" --metadata author="张三" input.html - 元数据较多时,写一个独立的YAML文件(比如
meta.yml),内容示例:
然后调用时指定这个文件:title: "我的文档" author: ["张三", "李四"] date: "2024-05-20" keywords: ["Pandoc", "元数据"]
这种方法不受输入格式限制,所有Pandoc支持的输入类型都能用。pandoc --from=html --to=pdf --metadata-file=meta.yml input.html
2. 用百分比格式内嵌元数据(适配pandoc_title_block扩展)
如果你一定要把元数据内嵌到输入内容里,可以用Pandoc支持的百分比标题块,把它放在HTML内容的最开头,注意要在<html>标签之前:
% 我的文档 % 张三 % 2024-05-20 <html> <body> <p>正文内容...</p> </body> </html>
然后调用时开启pandoc_title_block扩展:
pandoc --from=html+pandoc_title_block input.html --to=pdf
这样Pandoc会自动识别开头的百分比块作为元数据,不会当成HTML解析。
为什么html+yaml_metadata_block不生效?
你提到的yaml_metadata_block是Markdown专属的扩展,HTML解析器本身并不认识YAML元数据块的格式,所以即使加上这个扩展,Pandoc还是会把YAML内容当成普通的HTML文本处理(比如自动包裹成<pre>标签),自然无法识别为元数据。
内容的提问来源于stack exchange,提问作者bdesham




