最近帮同事做pdf导出功能,他选择了dompdf,结果在里面遇到了几个小坑。简单记录一下是什么情况和怎么解决的
1.不支持汉字
最开始的时候发现只要是汉字的地方全部变成? ,查了一下才发现是字体支持的问题。找到了一个相对靠谱的方法,下载安装了字体,结果却发现没什么卵用。
按照链接里面的内容要求,我检查了各个地方都没问题,然而却不起作用,最后我抱着试一试的心态,除了修改dompdf_font_family_cache.php这个文件,还一并修改了dompdf_font_family_cache.dist.php,修改完之后问题顺利解决,汉字能正常显示。
2.生成的pdf文件超大
汉字能正常显示完了之后又发生了另一个问题,我生成了三页pdf但是文件大小却达到了3.9M,去掉所有图片之后也有3.6M,排查下来发现问题还是出在汉字上,我当时选的是宋体,宋体的字体文件大小达到6.69M,似乎在生成pdf的时候会把字体文件一起嵌入。然后我开始寻找超小的字体文件,同时在github上跟作者反馈这个问题,询问有没有参数能解决这个问题。最后找到了一个比较合适的字体,方正超粗黑简体,1.6M,生成了7页pdf也只有2M不到,不过这个还是偏大,用tcpdf生成可以达到几百k。之后作者回复我说有个参数,文档里面没注明的,叫 启用字体子集,isFontSubsettingEnabled,字体子集仅使用PDF中存在的字形重新创建字体。对于具有大量字符子集的任何表意语言,可以节省大量空间。(文档里面没写真的是太坑爹了)
$dompdf = new Dompdf()
$dompdf->set_option('isFontSubsettingEnabled', true);
加了这个参数之后,7页pdf的文件大小降到了729k。
3.添加页码
这个方法是我在overstackflow里面找到并改装的,
$pdfManager = new DOMPDF();
$pdfManager->loadHtml($html);
$pdfManager->render();
$canvas = $pdfManager->get_canvas();
$footer = $canvas->open_object();
$w = $canvas->get_width();
$h = $canvas->get_height();
$canvas->page_text($w-60,28," {PAGE_NUM} / {PAGE_COUNT}", '',12);
$canvas->close_object();
$canvas->add_object($footer,"all");
return $pdfManager->stream();
$html就是html代码,贴上之后应该是可以直接生效的
4.兼容
因为使用了冷门字体,导致pdf离开windows之后就汉字显示不出来,只能用比较常用的中文字体来解决,亲测用宋体能在windows/mac/ios/android同时显示。在github上提了这个问题了。如果作者有回复我再回来继续更新
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。