一、技术选型
- Parsedown(Markdown 解析库)
• 纯 PHP 实现的 Markdown 解析引擎,无需依赖外部工具
• 支持 GFM(GitHub Flavored Markdown)语法 - mPDF(PDF 生成库)
• 支持从 HTML 生成 PDF,内置 CSS 样式解析
• 提供中文字体配置能力
二、实现步骤
1. 环境准备
# 通过 Composer 安装依赖
composer require erusev/parsedown
composer require mpdf/mpdf
2. 核心代码实现
<?php
require 'vendor/autoload.php';
// 初始化解析器
$parsedown = new Parsedown();
$mpdf = new \Mpdf\Mpdf([
'mode' => 'utf-8', // 中文编码支持
'format' => 'A4', // 纸张规格
'default_font' => 'stsong' // 使用内置中文字体
]);
// 读取 Markdown 文件
$markdownContent = file_get_contents('input.md');
// 转换为 HTML
$html = $parsedown->text($markdownContent);
// 添加 CSS 样式
$stylesheet = '
h1 { color: #2c3e50; border-bottom: 2px solid #3498db; }
pre { background: #f8f9fa; padding: 15px; border-radius: 5px; }
code { font-family: "Courier New", monospace; }
';
// 生成 PDF
$mpdf->WriteHTML($stylesheet, \Mpdf\HTMLParserMode::HEADER_CSS);
$mpdf->WriteHTML($html);
$mpdf->Output('output.pdf', 'D'); // D 表示直接下载
?>
三、高级功能扩展
- 批量处理功能
// 遍历目录中的 .md 文件
foreach (glob("docs/*.md") as $filename) {
$pdfName = pathinfo($filename, PATHINFO_FILENAME).'.pdf';
//...(此处插入上述转换逻辑)
}
- 自定义页眉页脚
$mpdf->SetHeader('||Generated by MD2PDF');
$mpdf->SetFooter('|{PAGENO}|');
- 数学公式支持
• 需在 HTML 头部添加 MathJax 库引用:
$mpdf->WriteHTML('<script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>');
四、替代方案对比
方案 | 优点 | 缺点 |
---|---|---|
本地库方案 | 无需外部依赖,部署简单 | 复杂表格支持较弱 |
Pandoc+PHP 调用 | 支持复杂学术排版 | 需服务器安装 LaTeX 环境 |
Wkhtmltopdf | 渲染精度高 | 需要二进制文件部署 |
五、注意事项
- 字体优化:可通过
$mpdf->fontDir
指定自定义中文字体路径 - 性能调优:处理 50 页以上文档时建议增加内存限制
ini_set('memory_limit', '512M');
- 安全防护:若用于线上服务,需对输入文件做格式校验和大小限制
完整实现代码可在GitHub示例仓库获取。如需处理复杂排版(如多级列表嵌套、流程图等),建议结合 CSS 打印媒体查询进行样式优化。
Was this helpful?
0 / 0