最近帮同事作pdf导出功能,他选择了dompdf,结果在里面遇到了几个小坑。简单记录一下是什么状况和怎么解决的
1.不支持汉字
最开始的时候发现只要是汉字的地方所有变成? ,查了一下才发现是字体支持的问题。找到了一个相对靠谱的方法,下载安装了字体,结果却发现没什么卵用。
按照连接里面的内容要求,我检查了各个地方都没问题,然而却不起做用,最后我抱着试一试的心态,除了修改dompdf_font_family_cache.php这个文件,还一并修改了dompdf_font_family_cache.dist.php,修改完以后问题顺利解决,汉字能正常显示。php
2.生成的pdf文件超大
汉字能正常显示完了以后又发生了另外一个问题,我生成了三页pdf可是文件大小却达到了3.9M,去掉全部图片以后也有3.6M,排查下来发现问题仍是出在汉字上,我当时选的是宋体,宋体的字体文件大小达到6.69M,彷佛在生成pdf的时候会把字体文件一块儿嵌入。而后我开始寻找超小的字体文件,同时在github上跟做者反馈这个问题,询问有没有参数能解决这个问题。最后找到了一个比较合适的字体,方正超粗黑简体,1.6M,生成了7页pdf也只有2M不到,不过这个仍是偏大,用tcpdf生成能够达到几百k。以后做者回复我说有个参数,文档里面没注明的,叫 启用字体子集,isFontSubsettingEnabled,字体子集仅使用PDF中存在的字形从新建立字体。对于具备大量字符子集的任何表意语言,能够节省大量空间。(文档里面没写真的是太坑爹了)html
$dompdf = new Dompdf() $dompdf->set_option('isFontSubsettingEnabled', true);
加了这个参数以后,7页pdf的文件大小降到了729k。android
3.添加页码
这个方法是我在overstackflow里面找到并改装的,ios
$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代码,贴上以后应该是能够直接生效的git
4.兼容
由于使用了冷门字体,致使pdf离开windows以后就汉字显示不出来,只能用比较经常使用的中文字体来解决,亲测用宋体能在windows/mac/ios/android同时显示。在github上提了这个问题了。若是做者有回复我再回来继续更新github