Python+Pdfkit 将 Markdown 笔记转成 PDF(带目录 + 代码高亮 + 自定义封面)
Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面或其他格式。随着 Markdown 的普及,越来越多的人开始使用它来记录笔记、撰写文档。有时候我们需要将 Markdown 文档转换为 PDF 格式,以便于打印、分享或进行其他形式的分发。本文将介绍如何使用 Python 和 Pdfkit 库将 Markdown 笔记转换为带有目录、代码高亮和自定义封面的 PDF 文件。
准备工作
在开始之前,请确保您已经安装了以下软件和库:
- Python 3.x
- Pdfkit
- Markdown
- Pygments(用于代码高亮)
您可以通过以下命令安装所需的库:
bash
pip install pdfkit markdown pygments
创建自定义封面
我们需要创建一个自定义封面。这可以通过简单的 HTML 和 CSS 实现。以下是一个简单的封面模板:
html
Markdown to PDF Cover
body {
font-family: Arial, sans-serif;
text-align: center;
margin-top: 100px;
}
h1 {
font-size: 24px;
color: 333;
}
p {
font-size: 18px;
color: 666;
}
Markdown to PDF
Generated by Python and Pdfkit
将上述代码保存为 `cover.html`。
转换 Markdown 为 HTML
接下来,我们需要将 Markdown 文档转换为 HTML。这可以通过 `markdown` 库轻松实现:
python
import markdown
def markdown_to_html(markdown_content):
html_content = markdown.markdown(markdown_content)
return html_content
代码高亮
为了在 PDF 中实现代码高亮,我们需要使用 Pygments 库。以下是一个函数,用于将代码块转换为高亮显示的 HTML:
python
from pygments import highlight
from pygments.formatters import HtmlFormatter
from pygments.lexers import get_lexer_by_name
def code_block_to_html(code_block, language):
lexer = get_lexer_by_name(language)
formatter = HtmlFormatter()
highlighted_code = highlight(code_block, lexer, formatter)
return highlighted_code
生成 PDF
现在,我们可以使用 Pdfkit 库将 HTML 内容转换为 PDF。以下是一个函数,用于生成带有目录、代码高亮和自定义封面的 PDF 文件:
python
from pdfkit import from_string
from pdfkit import from_file
import os
def markdown_to_pdf(input_file, output_file, cover_file=None):
将 Markdown 转换为 HTML
with open(input_file, 'r', encoding='utf-8') as file:
markdown_content = file.read()
html_content = markdown_to_html(markdown_content)
将代码块转换为高亮显示的 HTML 添加封面 生成 PDF 使用示例 总结 本文介绍了如何使用 Python 和 Pdfkit 库将 Markdown 笔记转换为带有目录、代码高亮和自定义封面的 PDF 文件。通过结合 Markdown、Pygments 和 Pdfkit,我们可以轻松地生成高质量的 PDF 文档,满足各种文档处理需求。 注意:在实际应用中,您可能需要根据您的具体需求调整代码,例如修改封面样式、代码高亮语言等。Pdfkit 的配置可能需要根据您的系统环境进行调整。
code_blocks = html_content.split('')
for i, code_block in enumerate(code_blocks):
if i % 2 == 1: 代码块
code_blocks[i] = code_block_to_html(code_block, 'python') 假设代码语言为 Python
html_content = '' + '
'.join(code_blocks) + '
'
if cover_file:
cover_html = from_file(cover_file)
html_content = cover_html + html_content
from_file = from_string(html_content, options={'footer-center': '[page]/[topage]', 'header-center': 'Markdown to PDF'})
from_file.to_pdf(output_file)
markdown_to_pdf('input.md', 'output.pdf', 'cover.html')
Comments NOTHING