使用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文档。
使用TCPDF输出完美的中文PDF文档的更多相关文章
- 使用PHP类TCPDF生成PDF文档
转自:http://www.blhere.com/1180.html 这两天遇到一个项目中,需要php自动处理生成pdf文档.在网上找了好几个类,最后决定使用TCPDF,使用的时候真是发现这个类真是强 ...
- 使用PHP生成PDF文档
原文:使用PHP生成PDF文档 实际工作中,我们要使用PHP动态的创建PDF文档,目前有许多开源的PHP创建PDF的类库,今天我给大家来介绍一款优秀的PDF库,它就是TCPDF,TCPDF是一个用于快 ...
- (实用篇)使用PHP生成PDF文档
http://mp.weixin.qq.com/s?__biz=MzIxMDA0OTcxNA==&mid=2654254929&idx=1&sn=8715d008d19af70 ...
- Servlet输出PDF文档方法
概述 Java Servlet 编程可以很方便地将 HTML 文件发送到客户端的 Web 浏览器.然而许多站点还允许访问非 HTML 格式的文档,包括 Adobe PDF.Microsoft Word ...
- 【转】Python读取PDF文档,输出内容
Python3读取pdf文档,输出内容(txt) from urllib.request import urlopen from pdfminer.pdfinterp import PDFResour ...
- 手机打开PDF文档中文英文支持(乱码问题)解决攻略
电子书的优点很多,随时随地阅读,无论白天黑夜走路坐车都能阅读:想确认一下某句话是不是这本书里的,搜索一下就可以知道:搬家也不用发愁,几万本书带在身上,依然轻松步行.我买了一台平板主要动因就是为了看书, ...
- 利用Java动态生成 PDF 文档
利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那 ...
- Java实现office文档与pdf文档的在线预览功能
最近项目有个需求要java实现office文档与pdf文档的在线预览功能,刚刚接到的时候就觉得有点难,以自己的水平难以在三四天做完.压力略大.后面查找百度资料.以及在同事与网友的帮助下,四天多把它做完 ...
- 常用PDF文档开发库
C++库: 1,PDF类库 PoDoFo http://podofo.sourceforge.net/ PoDoFo 是一个用来操作 PDF 文件格式的 C++ 类库.它还包含一些小工具用来解析 ...
随机推荐
- 51nod-1055-最长等差数列(dp+优化)
1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题 收藏 关注 N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 ...
- IOS-static cell 与 dynamic cell 混合使用
static cell 与 dynamic cell 混合使用 关于静态cell与动态cell的混合使用,google一下便会有很多相关文章,这里也是看过一些前辈的经验(已经忘记具体是从哪篇文章得到的 ...
- HDU 4122 单调队列
转载自:http://blog.csdn.net/lvshubao1314/article/details/46910271 DES :给出n个订单和m是商店的开放时间.然后n行给出n个订单的信息.然 ...
- ios 怎么禁止点击子视图的时候不响应父视图的点击事件
方法一 可以在触发手势的方法里添加一个区域的判断,如果点击区域正好是子视图的区域,则过滤掉,不处理此时的手势,如果点击的区域没有被子视图覆盖则,处理手势的事件.具体的代码如下: if( CGRect ...
- JBOSS context root 项目名字默认不写
进到 %JBOSS_HOME%/configuration/standalone.xml,修改下面节点 <virtual-server name="localhost" en ...
- 20181009-7 选题 Scrum立会报告+燃尽图 06
Scrum立会报告+燃尽图(06)选题 此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2196 一.小组介绍 组长:刘莹莹 ...
- ubuntu16.04 tensorflow pip 方式安装
首先,需要知道 tensorflow 1.5版本以上包括 1.5版本 的GPU类型都是需要安装 cuda9.0的, tensorflow-gpu 1.4版本是可以使用cuda 8.0. ...
- 移动端H5调用摄像头(选择上传图片)
<label>照相机</label> <input type="file" id='image' accept="image/*" ...
- 20155223 2016-2017-2 《Java程序设计》第8周学习总结
20155223 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 第14章 Channel是Java NIO用来衔接数据节点的功能,可定义缓冲区容量.标记内容 ...
- [BZOJ5312]冒险
bzoj CSAcademy description 一个序列\(a_i\),支持区间与一个数,区间或一个数,求区间最大值. \(n,m\le2\times10^5\) sol 线段树每个节点上维护区 ...