当前位置: 首页 > 后端技术 > PHP

laravel-dompdf的几个小坑

时间:2023-03-29 14:26:10 PHP

最近帮同事做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生成能达到几百千字节。后来作者回复我说有一个参数,文档中没有指定,叫enablefontsubsetting,isFontSubsettingEnabled,fontsubsetting只使用PDF中存在的字形重新创建字体。这可以为任何具有大量字符子集的表意语言节省大量空间。(文档里没有图片就真的坑了)$dompdf=newDompdf()$dompdf->set_option('isFontSubsettingEnabled',true);添加此参数后,7页pdf的文件大小减小到729k。3、添加页码的方法是我在overstackflow中找到并修改的,$pdfManager=newDOMPDF();$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");返回$pdfManager->stream();$html就是html代码,粘贴后应该可以直接生效。4.兼容性由于使用了冷门字体,pdf离开windows后无法显示汉字。只能通过使用更常用的中文字体来解决。个人测试,宋体可以在windows/mac/ios/android同时显示。这个问题是在github上提出的。如果作者有回复,我会回来继续更新