使用php把markdown文件转为pdf文件

一、技术选型

  1. Parsedown(Markdown 解析库)
    • 纯 PHP 实现的 Markdown 解析引擎,无需依赖外部工具
    • 支持 GFM(GitHub Flavored Markdown)语法
  2. 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 表示直接下载
?>

三、高级功能扩展

  1. 批量处理功能
   // 遍历目录中的 .md 文件
   foreach (glob("docs/*.md") as $filename) {
       $pdfName = pathinfo($filename, PATHINFO_FILENAME).'.pdf';
       //...(此处插入上述转换逻辑)
   }
  1. 自定义页眉页脚
   $mpdf->SetHeader('||Generated by MD2PDF');
   $mpdf->SetFooter('|{PAGENO}|');
  1. 数学公式支持
    • 需在 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渲染精度高需要二进制文件部署

五、注意事项

  1. 字体优化:可通过 $mpdf->fontDir 指定自定义中文字体路径
  2. 性能调优:处理 50 页以上文档时建议增加内存限制
   ini_set('memory_limit', '512M');
  1. 安全防护:若用于线上服务,需对输入文件做格式校验和大小限制

完整实现代码可在GitHub示例仓库获取。如需处理复杂排版(如多级列表嵌套、流程图等),建议结合 CSS 打印媒体查询进行样式优化。

Was this helpful?

0 / 0

发表回复 0