使用TCPDF输出完美的中文PDF文档
TCPDF是一个用于快速生成PDF文件的PHP5函数包。TCPDF基于FPDF进行扩展和改进。支持UTF-8,Unicode,HTML和XHTML。在基于PHP开发的Web应用中,使用它来输出PDF文件是绝佳的选择。但毕竟这款开源软件是外国人开发的,对中文的支持总不是那么尽如人意,因此我们需要对它作进一步的增强。
首先要下载TCPDF。访问http://www.tcpdf.org ,单击导航条上的”Download”链接,即可下载到最新版本的TCPDF压缩包。因为里面包含了范例和字体,因此文件大概有10M左右。下载完后解压它,会得到一个名为tcpdf的目录,此目录的结构大概是这样的:

TCPDF目录结构图
将此目录移动到Apache的网页根目录下(假设您使用的是Apache,并且使用80端口,如有不同请根据实际情况修改),打开浏览器,访问 http://localhost/tcpdf/ 应该就可以看到此目录下的文件和文件夹列表。由于TCPDF已经自带了一些范例,因此为了节省时间,我们可以直接对范例进行修改再使用。打开tcpdf目录下的examples目录,下面有50多个范例文件,其中example_038.php就是用来测试东亚字体的(比如简体/繁体中文、日文等等),打开此文件,找到$pdf->SetFont 这一行,修改为:
$pdf->SetFont('stsongstdlight', '', 20);
这一行代码的作用是设置PDF正文所用的字体及字号。其中”stsongstdlight”表示”STSongStdLight”字体,这是Adobe Reader的默认简体中文字体,TCPDF中已经内置这个字体的配置文件,我们只需直接调用即可。接下来,将$pdf->Cell那一段修改为:
$pdf->Cell(0, 10, '敏捷的棕毛狐狸跃过那只懒狗。', '',1, 1, 'C'); $pdf->Cell(0, 10, 'The quick brown fox jumps over the lazy dog.', '',1, 1, 'C'); $pdf->Cell(0, 10, '1234567890', '',1, 1, 'C');
保存,然后访问 http://localhost/tcpdf/examples/example_038.php 就可以生成一份PDF文档了:

使用默认中文字体生成的PDF文件
这种方式生成的PDF文件的优点是:文件体积小,生成快速。但也有缺点是,没有嵌入中文字体,只限于安装了Adobe Reader之后才能正常显示。那万一用户使用的是FoxIt Reader或者是Linux操作系统呢?显示效果就不一样了。因此,为了保证生成的PDF文件在任何环境下都有同样的显示效果,嵌入字体是必需的。
Windows下有很多中文字体,但是我们要用在TCPDF中的中文字体有下面几个要求:
- 支持Unicode,因为TCPDF支持的是Unicode;
- 体积越小越好;
- 最好是也支持繁体中文;
这样看来,微软雅黑以及方正的一些字体都符合要求。但是他们都是商业字体,而且个头都不小,以微软雅黑为例,msyh.ttf 文件就超过10M,如果使用它,生成的PDF文件体积也会很大。
综合考虑,我觉得”Droid Sans Fallback”字体符合要求:
- 首先它是免费字体;
- 其次它也是Unicode编码,支持简体繁体中文以及日文韩文等等;
- 然后它的体积很小,不超过5M。
然而TCPDF不支持TTF字体文件,因此我们先将它转换成TCPDF支持的格式,然后再使用。在TCPDF目录下有个fonts子目录,这个子目录下又有个utils,这里面带有一个字体转换工具ttf2ufm.exe。下面是转换的步骤:
在网上很容易找到Droid Sans Fallback字体的下载链接,因此在这里就没有必要多做描述了。我们把下载到的 DroidSansFallback.ttf 复制到 TCPDF\fonts\utils 下面,然后打开Windows的命令行,切换到此路径下,输入如下命令:
D:\www\tcpdf\fonts\utils>ttf2ufm -a -F DroidSansFallback.ttf
等待一段时间,等到命令行窗口显示
"Finished - font files created"之后,可以发现此目录下生成了DroidSansFallback.afm,DroidSansFallback.t1a 和 DroidSansFallback.ufm 这三个文件。
在命令行中输入
"C:\Program Files\WAMP\PHP5\php.exe" -q makefont.php DroidSansFallback.ttf DroidSansFallback.ufm
说明:这里的”C:\Program Files\WAMP\PHP5\php.exe”为php.exe文件所在的路径,请根据实际情况输入。回车运行之后,稍等片刻,命令行窗口中会提示
Font definition file generated至此大功告成。将生成的droidsansfallback.php、droidsansfallback.z以及droidsansfallback.ctg.z这三个文件复制到 TCPDF\fonts 下面即可。
打开example_038.php文件,将
$pdf->SetFont('stsongstdlight', '', 20);
修改为
$pdf->SetFont('droidsansfallback', '', 20);
这样就能够调用我们刚才生成的字体,再访问 http://localhost/tcpdf/examples/example_038.php 就可以看到重新生成的PDF文档。

嵌入DroidSansFallback字体后的PDF文档
35 条评论
又来跑这里了呵呵
已阅
It helped.
Thanks.
楼主内给个下载链接吗
我按照你的 方法 无法生成
提示错误:
Auto-detected front-end parser ‘ttf’
(use ttf2pt1 -p? to get the full list of available front-ends)
**** Cannot access DroidSansFallback.ttf ****
不好意思,换了工作,电脑上的文件来不及备份,这些文件都已经没有了,没办法给你下载。按理说,根据这一方法是可以生成字体文件的,可能是你下载的DroidSansFallback.ttf 这个文件损坏了? 等我再研究一番。
雅黑太悲剧了,一个文件接近20mb。。。
楼主好,我在
D:\www\tcpdf\fonts\utils>ttf2ufm -a -F DroidSansFallback.ttf 这一步的时候总是提示
Auto-detected front-end parser ‘ttf’
(use ttf2pt1 -p? to get the full list of available front-ends)
**** Cannot access DroidSansFallback.ttf ****
我用电脑里的其他ttf文件也是这样。为什么啊?..焦急等回复
会有错误提示,原因我也是百思不得其解,不过不用理会这些提示信息,稍等片刻就可以看到“Finished – font files created”,这就说明字体生成成功了。
不错,可是 我的生成好了,传到豆丁上面就不能访问了@@
你和,制作字体的过程很顺利,但是到最后生成PDF的时候,总是超时,Fatal error: Maximum execution time of 100 seconds exceeded in /var/www/tcpdf/tcpdf.php on line 8510 设成100秒还超时,难道要更多时间吗?
这个脚本执行时间可能跟服务器当时的负载以及数据量有关,如果无法修改 php.ini 的话也可以在你的程序中使用 set_time_limit(300); 来设置较长的运行时间。
我试过了 , 字体效果很好 ,但下载速度比之前慢了 近 10多倍。 不知道博主遇到类似问题没
嵌入了字体,文件大小增长了,下载速度慢也是正常的。
Fatal error: Maximum execution time of 60 seconds exceeded in /var/www/tcpdf/tcpdf.php on line 8604
can you help me ?
Thank you for your support. I success to create PDF but I cannot diaplay “跃过” and “懒” word….do you have any idea ? Thank you so much.
Modify the max_execution_time value defined in the php.ini.
If you can’t get the permission to modify it, call the set_time_limit() function in your php script before creating the pdf file.
Get a new version of DroidSansFallback.ttf. Or chose a different font.
i have this error:
“Fatal error: Maximum execution time of 60 seconds exceeded in C:\xampp\htdocs\includes\tcpdf\tcpdf.php on line 9173″
but it works successfully in the same VMware image in another machine, may i know why?
这个很实用
CodeIgniter 你用了多久了?2.0怎么样你觉得??
09年的时候开始接触,其实目前还在学习过程中。2.0变化较大,也是还在研究的过程中。
谢谢!好文!
简明扼要,操作性极强!
可是我:
我使用joomshoping 3.0.0(for joomla1.6),按本文方法,不嵌入字体成功。但生成三种字体并拷贝到font文件夹,修改应用文件后,不行。顺便说一句,希望高手指点。我不知道我哪里错了?]
使用博主给的字体文件执行时间比较长基本上操作php的默认最大执行时间,通过xdebug对tcpdf进行分析,因为字体文件比较大性能消耗最大的是_getTrueTypeFontSubset 这个函数,
这个函数是用来获得字体的子集以减少生成的pdf文件的大小。通过使用$pdf->setFontSubsetting(false);可以避免调用_getTrueTypeFontSubset。生成的速度会明显加快,但是文件变大。
要是谁能优化一下_getTrueTypeFontSubset 函数那就两全齐美了。经过权衡我还是使用了$pdf->setFontSubsetting(false)加快pdf的生产速度
請問一下版主,如果要直印的話,怎麼設定,我指的不是紙張方向,而是文字方向,如果要印中式信封遇到設定呢?
很遗憾,这种做法我还没研究过,无法给你帮助。建议仔细阅读TCPDF的相关文档看看有没有相应参数可设定。有时间我也仔细学习和测试一下。
罗崇说的对,希望楼主搞一个解决方案出来,既能使用那个超级棒的字体,又能缩短生成pdf的时间,同时希望还能控制PDF文件的大小。
内容搞定了,但是文件名还是乱码,楼主有解决方法吗
我制作了一个行楷的字体,字体倒时生成了,但生成的PDF只显示一部分字体。。。多数字体显示不出。。
楷体也是如此,神马问题?求楼主回答。
不好意思,楷体没有接触过,缺字是不是字符集的问题?因为有些字体文件是GB2312的。
怎麼加粗中文字體?tcpdf?
相同情况,中文字符乱码,有解决方案吗?
楼主如何联系啊,有偿求助。我QQ就是QQ邮箱前面的那个,可以告知如何联系你吗?