RSS
  • 首页
  • 关于

使用TCPDF输出完美的中文PDF文档

2009年8月20日 by admin | 18 Comments »

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

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文件

这种方式生成的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文档

嵌入DroidSansFallback字体后的PDF文档


PHP | Tags: DroidSansFallback, pdf, tcpdf


18 Responses to “使用TCPDF输出完美的中文PDF文档”


  1. 开心凡人
    2009年12月9日 at 22:26

    又来跑这里了呵呵


  2. www.cjkcn.com
    2009年12月14日 at 08:47

    已阅


  3. kolidon
    2009年12月24日 at 10:12

    It helped.
    Thanks.


  4. 小张
    2010年2月4日 at 16:37

    楼主内给个下载链接吗

    我按照你的 方法 无法生成

    提示错误:
    Auto-detected front-end parser ‘ttf’
    (use ttf2pt1 -p? to get the full list of available front-ends)
    **** Cannot access DroidSansFallback.ttf ****


  5. admin
    2010年2月6日 at 09:19

    不好意思,换了工作,电脑上的文件来不及备份,这些文件都已经没有了,没办法给你下载。按理说,根据这一方法是可以生成字体文件的,可能是你下载的DroidSansFallback.ttf 这个文件损坏了? 等我再研究一番。


  6. Fantel
    2010年3月7日 at 20:23

    雅黑太悲剧了,一个文件接近20mb。。。


  7. Ted
    2010年4月1日 at 18:19

    楼主好,我在
    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文件也是这样。为什么啊?..焦急等回复


  8. admin
    2010年4月2日 at 15:23

    会有错误提示,原因我也是百思不得其解,不过不用理会这些提示信息,稍等片刻就可以看到“Finished – font files created”,这就说明字体生成成功了。


  9. 笑话大王
    2010年4月23日 at 15:48

    不错,可是 我的生成好了,传到豆丁上面就不能访问了@@


  10. TCPDF开源项目 - PDF - php开源项目 - php免费pdf生成软件 - php开源软件 - TCPDF - 开源网
    2010年5月15日 at 09:48

    [...] 附:使用TCPDF输出完美的中文PDF文档 [...]


  11. 冬瓜炒木耳
    2010年8月17日 at 16:54

    你和,制作字体的过程很顺利,但是到最后生成PDF的时候,总是超时,Fatal error: Maximum execution time of 100 seconds exceeded in /var/www/tcpdf/tcpdf.php on line 8510 设成100秒还超时,难道要更多时间吗?


  12. admin
    2010年8月19日 at 16:24

    这个脚本执行时间可能跟服务器当时的负载以及数据量有关,如果无法修改 php.ini 的话也可以在你的程序中使用 set_time_limit(300); 来设置较长的运行时间。


  13. huangrs
    2010年8月20日 at 10:42

    我试过了 , 字体效果很好 ,但下载速度比之前慢了 近 10多倍。 不知道博主遇到类似问题没


  14. admin
    2010年8月20日 at 14:51

    嵌入了字体,文件大小增长了,下载速度慢也是正常的。


  15. Macca
    2010年9月6日 at 19:14

    Fatal error: Maximum execution time of 60 seconds exceeded in /var/www/tcpdf/tcpdf.php on line 8604
    can you help me ?


  16. Macca
    2010年9月6日 at 19:28

    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.


  17. admin
    2010年9月8日 at 09:49

    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.


  18. admin
    2010年9月8日 at 09:51

    Get a new version of DroidSansFallback.ttf. Or chose a different font.



发表评论





IT狂人的博客

  • 声明

    本博文章及相关作品(包括但不限于文字、图片),除特别说明为转载外,均属本人原创,依据《国家知识产权法》、《著作权法》和《信息网络传播权保护条例》,原创知识产权、版权均为本人所有,本人享有著作权,并受法律保护。

    文章欢迎转载,但请事先与本人联系:email
    未经本人许可,任何人不得转载或使用整体或任何部分的内容。未尽事宜,依据相关法律法规处理。

  • 分类目录

    • ASP .Net (1)
    • CodeIgniter (8)
    • PHP (10)
    • Web (7)
    • 未分类 (1)
    • 杂谈 (4)
    • 译文 (7)
    • 音乐&电影 (1)
  • 最近文章

    • Discuz上传图片时出现“无效的图片文件”提示的解决方案
    • discuz定时发帖的另类实现
    • 使用PHP的Glob()函数来遍历文件夹
    • [译]PHP面向对象入门
    • 原来如此
    • 使用htaccess来增强WordPress安全性
    • 归来
    • 因4740G而想起的事
    • 选择Web开发框架时需要考虑的15个重要因素
    • 为NetBeans添加Git支持
  • 文章归档

    • 2010 年 八月 (2)
    • 2010 年 七月 (5)
    • 2010 年 五月 (1)
    • 2010 年 四月 (1)
    • 2010 年 三月 (2)
    • 2010 年 二月 (1)
    • 2010 年 一月 (2)
    • 2009 年 十二月 (1)
    • 2009 年 十月 (2)
    • 2009 年 九月 (3)
    • 2009 年 八月 (10)
  • 标签

    API AVC CakePHP CHM CodeIgniter CURD discuz Django DroidSansFallback eaccelerator footer Framework Fran Healy Git helper IT Kohana MVC MVP MYSQL NetBeans Oasis ORM pChart pdf PHP phpMyAdmin Ruby tcpdf techified time Travis Twitter Web windows Wordpress XML Zend 传记 外链 大写 孔乙己 框架 盗链 过滤
  •  

    2009 八月
    一 二 三 四 五 六 日
        九 »
     12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31  
  • Playlist


  • 近期评论

    • admin 在 [译文]在NetBeans IDE中增加CodeIgniter代码提示 上的评论
    • admin 在 使用TCPDF输出完美的中文PDF文档 上的评论
    • admin 在 使用TCPDF输出完美的中文PDF文档 上的评论
    • Macca 在 使用TCPDF输出完美的中文PDF文档 上的评论
    • Macca 在 使用TCPDF输出完美的中文PDF文档 上的评论
  • 链接

    • cnBeta.COM
    • CodeIgniter 中国
    • Gray && Simple
    • jQuery中文社区
    • Lily Allen
    • Mtime时光网
    • W3School
    • 小众软件
    • 破烂熊乐园
    • 韩寒
Copyright © 2010 IT狂人的博客 All Rights Reserved. XHTML CSS THEME by I SOFTWARE REVIEWS