2011-09-26 09:04 418人阅读 评论(0) 收藏 举报

PHP生成PDF完美支持中文,解决TCPDF乱码

发布者: logken 分类: php 
Tags: PHP PDFTCPDF中文TCPDF乱码TCPDF生成中文PDF

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

将此目录移动到WEB网站的根目录下(假设您使用的是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->Write(0,’敏捷的棕毛狐狸跃过那只懒狗‘, ”, 0, ’L', true, 0, false, false, 0);

$pdf->Write(0,’The quick brown fox jumps over the lazy dog.’, ”, 0, ’L', true, 0, false, false, 0);

$pdf->Write(0,’1234567890′, ”, 0, ’L', true, 0, false, false, 0);

保存,然后访问 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 下面即可。

生成不成功也没问题,另一个方法是到Joomla中文官网http://www.joomlagate.com下载Joomla中文程序找到\language\pdf_fonts目录下复制droidsansfallback.php、droidsansfallback.z以及droidsansfallback.ctg.z这三个文件也是可以的
打开example_038.php文件,将

$pdf->SetFont(‘stsongstdlight’, ”, 20);

修改为

$pdf->SetFont(‘droidsansfallback’, ”, 20);

这样就能够调用我们刚才生成的字体,再访问 http://localhost/tcpdf/examples/example_038.php 就可以看到重新生成的PDF文档。

嵌入DroidSansFallback字体后的PDF文档

附注:SetHeaderData里中文的解决方法为:tcpdf\config\tcpdf_config.php

define (‘PDF_FONT_NAME_MAIN’, ’helvetica’);

改为: define (‘PDF_FONT_NAME_MAIN’, ’stsongstdlight’);

define (‘PDF_FONT_NAME_DATA’, ’helvetica’);

改为: define (‘PDF_FONT_NAME_DATA’, ’stsongstdlight’);

就可以把example_038.php文件中的

$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.’ 038′, PDF_HEADER_STRING);

改为:

$pdf->SetHeaderData(PDF_HEADER_LOGO,PDF_HEADER_LOGO_WIDTH,’中文头部’, ’作者和版权’);

假如你的网站源码为GBK格式 输出的PDF内容为乱码的话 就需要做个简单的转换了,把需要打出的中文文字做

iconv(“gb2312//TRANSLIT”,’utf-8′,$str);

$pdf->Write(0,iconv(“gb2312//TRANSLIT”,’utf-8′,’解决GBK网站输出中文乱码问题‘), ”, 0, ’L', true, 0, false, false, 0);

转载请注明来源于: http://www.5eyi.com/php-to-generate-pdf-the-perfect-support-for-the-chinese-to-address-the-garbage-tcpdf/trackback/

PHP生成PDF完美支持中文,解决TCPDF乱码的更多相关文章

  1. Magento PDF发票,支持中文,以及修改的办法

    Magento PDF发票,支持中文,以及修改的办法.   如果让magento的PDF发票支持中文.Magento生成PDF发票.使用的是zend framework的zend_pdf类. 下面是一 ...

  2. Ubuntu 15.04下MySQL 5.6.25不支持中文解决办法

    Ubuntu 15.04下MySQL 5.6.25不支持中文解决办法,apt-get install 安装的,不是源码包安装的mysql. 1 修改mysql的配置文件 /etc/mysql/conf ...

  3. tcpdf导出pdf数据支持中文的解决方案

    步骤如下:1.确保你测试tcpdf能正常输出英文内容的pdf2.测试输入中文内容后显示是?的乱码或者空白分析原因,是因为我们输入的中文,tcpdf字体库并不支持,因此乱码或者空白显示 添加一个合适的字 ...

  4. 让Source Insight完美支持中文注释

    如何让source insight支持中文注释,解决回车删除,移动光标出现乱码的问题?下面是解决方案:     -------Source Insight3 中文操作(左右键.删除和后退键)支持宏-- ...

  5. html 字符串 生成 pdf 完美解决中文不显示

    //maven <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf< ...

  6. (转)pymysql 连接mysql数据库---不支持中文解决

    往数据库里插入中文时出现异常:UnicodeEncodeError: 'latin-1' codec can't encode characters 就是编码的问题,pymysql默认的编码是lati ...

  7. 让pandoc输出pdf时支持中文

    主机环境为:Ubuntu 12.04 LTS.对于RH系列,yum安装包的名称可能会有不同,不过yum联想能力比较强,应该不是问题. 安装pandoc,安装tex-live sudo apt-get ...

  8. Jupyter Notebook 导出PDF与Latex中文支持

    Jupyter Notebook 最近搞机器学习用到了Jupyter Notebook. 作为一个实时记事本,有时需要将内容导出为PDF. 但是,Jupyter Notebook自带的File -&g ...

  9. 电子凭证 : Java 生成 Pdf

    来源:蛙牛, my.oschina.net/lujianing/blog/894365 如有好文章投稿,请点击 → 这里了解详情 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中 ...

随机推荐

  1. Golang操作MySQL的正确姿势

    封装原因: 查看了很多网上提供的ORM类型的数据库操作,觉得比较麻烦,需要提前配置很多的表结构体,然后才能使用,对于数据表很多的项目就配置起来就比较麻烦,所以对golang的mysql包进行了外层包装 ...

  2. (转)Kubernetes设计架构

    转:https://www.kubernetes.org.cn/kubernetes设计架构 Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, ...

  3. SQL学习记录:定义(一)

    --1.在这里@temp是一个表变量,只有一个批处理中有效,declare @temp table; --2. 如果前面加#就是临时表,可以在tempDB中查看到,它会在最后一个使用它的用户退出后才失 ...

  4. 九. jenkins用户权限管理

    由于jenkins默认的权限管理体系不支持用户组和角色的配置,所以需要使用第三方插件来支持角色的配置: Role-based Authorization Strategy 1.先安装插件,如下: 2. ...

  5. frida的js脚本处理正则的一个小坑

    frida的server模式需要python支持,所以js脚本中的正则需要多一次转义 比如匹配"/proc/{数字pid}" server: paramPath.match(&qu ...

  6. 《图解设计模式》读书笔记6-2 Chain of Responsibility模式

    目录 1. 简介 2. 示例程序 类图 代码 3. 模式的角色和类图 角色 类图 4. 思路拓展 1. 简介 Chain of Responsibility模式是责任链模式,模式的核心就是转移责任.就 ...

  7. vscode 配置 golang开发环境

    如果你使用golang,那么强烈建议你采用vscode作为IDE. 1. 首先在vscode 当中安装go插件,如上图 2. 配置 %AppData%\Code\User\settings.json ...

  8. C++中一个类(非继承类)对象,所占内存空间大小

    离职后在家里带了半年多了,这半年多里没有编写过一行代码,倒是看过一些书,但是差不多也都是囫圃吞枣.房子也快要装修,也得赶快找一个工作了,不然养车,还要玩摄影,没收入的日子真是不好过啊.呵呵. 按惯例, ...

  9. websocket简单实现聊天

    1.多人聊天 from geventwebsocket.handler import WebSocketHandler # 请求处理WSGI HTTP from geventwebsocket.ser ...

  10. 记录一次kibana启动Unable to fetch data from reporting collector

    版本不匹配导致 应该es与kibana版本一致 本文链接:https://blog.csdn.net/qq_33293753/article/details/87894882