首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >将markdown文件转成PDF(支持代码块、公式)

将markdown文件转成PDF(支持代码块、公式)

作者头像
Michael阿明
发布2026-03-25 13:55:52
发布2026-03-25 13:55:52
940
举报

文章目录

  • 方法一:使用 `WeasyPrint`
  • 方法二:使用 `pdfkit` 和 `wkhtmltopdf`
  • 方法三:使用 `md2pdf`
  • 方法四:使用 `pandoc` 和 `wkhtmltopdf`
  • 效果对比

方法一:使用 WeasyPrint

需要安装 WeasyPrintmarkdown 包:

代码语言:javascript
复制
pip install weasyprint markdown
代码语言:javascript
复制
import markdown
from weasyprint import HTML, CSS

# 读取Markdown文件
with open('example.md', 'r', encoding='utf-8') as f:
    text = f.read()
    html = markdown.markdown(text, output_format='html5')

# 将HTML转换为PDF
HTML(string=html).write_pdf("output_weasyprint.pdf")

方法二:使用 pdfkitwkhtmltopdf

需要安装 pdfkitmarkdown 包:

代码语言:javascript
复制
pip install pdfkit markdown
apt install wkhtmltopdf
代码语言:javascript
复制
import pdfkit
import markdown

# 读取Markdown文件
with open('example.md', 'r', encoding='utf-8') as f:
    text = f.read()
    html = markdown.markdown(text)

# 添加中文字体样式到HTML
html_with_style = f"""
<html>
<head>
    <meta charset="UTF-8">
    <style>
        body {{
            font-family: 'SimHei', 'Microsoft YaHei', sans-serif;
            font-size: 12pt;
        }}
    </style>
</head>
<body>
{html}
</body>
</html>
"""

# 使用额外参数启用本地文件访问(用于加载字体)
pdfkit.from_string(html_with_style, 'output_pdfkit.pdf', options={'enable-local-file-access': None})

方法三:使用 md2pdf

代码语言:javascript
复制
pip install md2pdf weasyprint
代码语言:javascript
复制
from md2pdf.core import md2pdf

def convert_md_to_pdf(input_md_file_path, output_pdf_file_path):
    """
    Converts a Markdown file to a PDF file with Chinese font support.
    """
    with open(input_md_file_path, 'r', encoding='utf-8') as f:
        text = f.read()

    # 转换并应用样式
    md2pdf(output_pdf_file_path, md_content=text)

方法四:使用 pandocwkhtmltopdf

代码语言:javascript
复制
pip install pypandoc
apt install pandoc wkhtmltopdf
代码语言:javascript
复制
import pypandoc

def md_to_pdf_pandoc(input_md, output_pdf):
    try:
        output = pypandoc.convert_file(
            input_md, 'pdf', outputfile=output_pdf,
            extra_args=['--pdf-engine=wkhtmltopdf']  # 使用 xelatex 替代 pdflatex
        )
        print(f"PDF 已生成:{output_pdf}")
    except Exception as e:
        print("转换失败:", str(e))

不支持公式渲染。

安装 Tex 组件

代码语言:javascript
复制
sudo apt update
sudo apt install texlive-latex-base texlive-fonts-recommended texlive-fonts-extra texlive-latex-extra texlive-xetex  texlive-full

使用 xelatex 引擎,下载模板 https://github.com/Wandmalfarbe/pandoc-latex-template?tab=readme-ov-file,放到 /root/.local/share/pandoc/templates

代码语言:javascript
复制
import pypandoc

def md_to_pdf_pandoc(input_md, output_pdf):
    try:
        # 使用自定义 LaTeX 模板或内联样式
        output = pypandoc.convert_file(
            input_md, 'pdf',
            outputfile=output_pdf,
            extra_args=[
                '--pdf-engine=xelatex',
                '-V', 'documentclass=ctexart',  # 使用 ctex 宏包支持中文
                '-V', 'CJKmainfont=SimHei',     # 设置中文字体
                '-V', 'monofont=DejaVu Sans Mono',  # 设置等宽字体以支持代码块
                '-V', 'geometry:margin=1in',    # 设置页边距
                '--template=eisvogel',  # 使用自定义模板
                '--listings',
                '--highlight-style=pygments'    # 使用语法高亮风格(带背景色)
            ]
        )
        print(f"PDF 已生成:{output_pdf}")
    except Exception as e:
        print("转换失败:", str(e))

# 调用函数
md_to_pdf_pandoc('example.md', 'out.pdf')   # from https://michael.blog.csdn.net/

效果对比

原始MD

WeasyPrint

pdfkit

md2pdf

pandoc

pandoc+tex

代码块、公式、表格都不行

最后一种方法虽然麻烦点,但是也是最美观的,有没有。欢迎关注点赞收藏!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Michael阿明 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 方法一:使用 WeasyPrint
  • 方法二:使用 pdfkit 和 wkhtmltopdf
  • 方法三:使用 md2pdf
  • 方法四:使用 pandoc 和 wkhtmltopdf
  • 效果对比
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档