Tag Archive for PDF

在PHP里使用TCPDF生成PDF中svg遇到的中文字体问题解决办法

前段时间因为工作需要,做了一个输出日报的功能,是生成PDF的,然后研究了一番,最后选定使用TCPDF来生成。官网虽然做的很low,但是功能确实不错。

这里先卖个关子,一开始我还研究了使用HTML转PDF的东西,最后还的放弃了这种方案,至于原因嘛,其实很简单:HTML2PDF只能做到通用的转PDF需求,对应像我们这样需要“精致”的PDF的话,HTML转PDF会显得业余些,或者说是不能满足“分页、页面页脚甚至是目录的功能”,当然,转的结果中,PDF显示效果还是会和原HTML有差异的,所以被pass掉了。

言归正传,其实TCPDF已经比较强大了,在使用中遇到的最大的问题还是中文问题,网上搜索”TCPDF 中文”其实也有不少人有解决,主要是要用一个中文字体。网上都有的下载,而且只要支持unicode编码的字体都可以转成TCPDF专用,可以自制,比较简单,找来字体,然后用下载的包里的tools里的tcpdf_addfont.php就可以生成,生成的文件会到fonts目录

字体加好后,比如字体名称是“dejavusans”,只要

$pdf->SetFont('dejavusans', '', 14, '', true);

就可以了,当然,如果是html的内容,也可以直接用 style=”font-family:’dejavusans’;” 这样的标签进行设置,还是很方便的

在实际使用中,我发现如果传一个svg的过去(比如我需要用svg输出曲线图),设置SetFont的方法是没用的,有中文的话,必须在中文字里面设置 font-family,这个一定要注意,否则自己的中文字都是问号了。例如:

<text x="10" y="21" style="font-family:'arialuni';"><tspan>你好啊</tspan></text>

这边特别提醒下有个坑,很奇葩的坑,之前不知道,因为svg是xml的嘛,代码通常也是格式化好的,有换行符,比如是:

<text x="10" y="21" style="font-family:'arialuni';">
    <tspan>你好啊</tspan>
</text>

然后坑就来了,在生成的PDF里会在文字最后输出一个方框框,英文的不设置字体的话就没这个问题,百思不得其解,经过反复测试,后来发现是xml里的换行符导致的。也就是说在svg里的这些不支持换行符,即便是英文的,也会被现实成空格一样,不能实际换行,是bug?不得而知。

然后把这些换行符去掉,中文方框的问题也解决了,完美了。。。

最后附带我自己做的1个字体吧,一个是helvetical细体字,叫“helveticalighti”,是mac系统自带的,用于显示数字、英文超好看哦

helveticalight for tcpdf