在之前一篇笔记里面讲到了安装pandoc来生成pdf文件,其实我在使用pandoc之前,来想过用php的第三方库来将md转成html,然后把html转换成pdf。

将md转成html

我用的php库是"erusev/parsedown": "^1.7",官方链接在这里

使用Parsedown::instance->text($mdStr)就能够将md转成html,如下方代码所示。md到html的转换耗时很短

        $html = Parsedown::instance()->text($mdStr);

将html转成pdf

我用的是库是"dompdf/dompdf": "^0.8.2", 官方链接在这里

为了使生成的html指定字体,我还给html指定了font-family,注意下面直接使用$dompdf->stream()可以实现在浏览器里面下载。但是如果文件太大的时候,php分配的内存会不够

        $html = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>' . '<style>body{font-family:firefly, DejaVu Sans, sans-serif;}</style></head><body>' .  $html . '</body></html>';
        $dompdf = new \Dompdf\Dompdf();
        $dompdf->loadHtml($html);
        $dompdf->render();
        $dompdf->stream();

注意:

上方在font-family里面指定的首选字体是firefly,这是我从网上找的中文字体。在使用dompdf将html转成pdf的时候,还需要几个步骤来加载字体:

  • dompdf/utils的Git库下载load_font.php脚本

  • 手动添加到vender/dompdf/dompdf/下,与lib和src同级

  • 从网上找到中文字库,例如叫fireflysung.ttf

  • 将该中文字符导入到dompdf中,命令为php load_font.php firefly fireflysung.ttf

  • 在php代码里面,使用dompdf时,需要注明font-family


整个html到pdf的耗时还是很长的。

我对比了一下pandoc和php的耗时,同样一个md文件,pandoc只花了4秒,但是php花了约2分钟。所以我最后还是选择的pandoc。