PHP使用FPDF的多字体解决

本文详细介绍了如何在PHP的FPDF库中添加中文字体,包括使用ttf2pt1.exe工具处理字体文件,创建并使用自定义字体,以及解决英文字符间距问题。通过实例演示了添加微软雅黑和黑体字体的过程,同时提供了相关资源下载链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提:
PHP能够应用一些常见的pdf插件生成PDF文档,这里我选择的是FPDF。
原版的FPDF是没有中文的,如果要使用中文需要再下载一个中文扩展文件(就是在原本fpdf.php基础上继承开发的新类,一般是一个文件,网上都能找到源码,几百行的样子)
看到这里,你应该完整部署好FPDF工具类,并且能用中文扩展输出中文字体
————————————————正文开始————————————————————————
一般来说,中文包只自带默认字体,但是我们经常需要使用其他字体(自带的好像是宋体黑体,不过这两个我看来没区别),其他字体包括中文字体和英文字体,例如在输出条形码号的字体一般要求是OCR-B10BT,或者有的需求是要微软雅黑字体,那么我们就需要添加新的字体在fpdf中。

如果你是正确安装了普遍网上找到的版本,那么你的fpdf应该是支持添加字体的。这里我引用的是一个叫“春哥也编程”的博客,我怕博客崩溃了所以早早下载到本地了,所以网址忘了,就不贴了,应该能搜的到这个博客。**

下面的过程和这个引用的博客的内容可能不太一样,请先以我这个为标准试试,我这个方法是成功输出了其他中文字体的

需要工具:(在下面我会放百度网盘链接,这两个东西太难找了,我找了好久才找到。下面还会放一个好用的字体转换工具,让ttc转成ttf)
1.ttf2pt1.exe
2.ugbk.map

先来制作中文字体,把TTF2TP1里的ttf2tp1.exe解压到一个易于操作的文件夹里,因为要使用WIN的命令行工具,这里就用“C:\ttf”了。然后把TTF2TP1中文包里的ugbk.map也解压到这个目录下。
  从你的WIN字体文件夹中找到你想要处理的字体,这里用的是黑体(simhei.ttf),也复制到这个文件夹下吧。
  在命令行工具里运行C:\ttf\ttf2pt1.exe -a -L ugbk.map+a1 simhei.ttf simhei,特别提醒:命令里的所有字符都是半角的,网上某人转载戒烟如你上次的文章时把两个横线转成了全角,有人运行时提示错误,建议最好不要复制,自己用键盘输入。
  经过一番艰苦的运行,C:\ttf文件夹里多出了simhei.afm和simhei.t1a两个文件,后面一个没用了,保留simhei.ttf和simhei.afm,一会儿用。
  解压FPDF压缩包,把他们解压或上传到你的服务器目录里吧,如果用的是LINUX的服务器,记得把/font文件夹属性改为777,生成的字体文件要写入到这里。我这个demo项目目录如下:
  这里写图片描述
  把FPDF中文包里的chinese.php和ex.php两个文件解压或上传到FPDF的根目录下。
  把刚才提到的simhei.ttf和simhei.afm复制或上传到/font文件夹内。
  并且把simhei.afm复制一份到makefont文件夹里,改名为simhei.afm.map
  在/font文件夹里建立一个文件,形如:
 

<?php   
    require('../makefont/makefont.php');   
    makeFont('simhei.ttf', 'simhei.afm');   
?>  

使用浏览器浏览该文件,屏幕上出现N多东西,不管它,只要看到又生成了两个文件simhei.php和simhei.z,制作字体的工作就完成了。做多个字体重复上面的工作就可以。所有的字体做完之后,可以把/font/makefont.php文件和/font/makefont文件夹给删除掉。用LINUX服务器的朋友记得把/font文件夹的属性给改回来。
  让我们来修改/ex.php文件,或者干脆叫重新编写这个文件:
  

<?php
require ('chinese.php');

$pdf = new PDF_Chinese ();
$pdf -> AddGBFont ('simhei', '黑体');
$pdf -> Open ();
$pdf -> AddPage ();
$pdf -> SetFont ('simhei', '', 20);
$pdf -> Write (10, '中国智造0123456789'); 
//输出中文也许会乱码,如果乱码了,改成$pdf -> Write (5, iconv("UTF-8","gbk",'中国智造0123456789'));
$pdf -> Output();
?>

用浏览器看一下,黑体出来了吧?不过效果似乎不太让人满意,中文没问题,英文间距出问题了,是不是?
具体原因在于chinese.php文件里,戒烟如你注意到里面有个变量叫$GB_widths,似乎是定义英文字符宽度的,戒烟如你经过一番调试,把所有英文、字符宽度全部改成了480,这就比较满意了!

———————————————————引用结束——————————————————————————
个人总结,这里要注意的点:
1.上面的方法对中文字体适用,很慢(有时也挺快的),别以为卡机之类的了,毕竟中文字很多,二十分钟还是要的,可能要更久。建议先自己做个英文字体的试试效果,再试试中文的字体有没效果。

1.1 英文字体添加不能用上面的方法,用回官方的方法http://www.fpdf.org/,Tutorials找到Tutorials7,这里看怎么添加英文字体,这个挺简单的,而且速度很快。我之前加英文字体还用上面中文的方法,坑了自己好久,心血来潮看了下官方文档才加进了英文字体。。。。

2.字体形状可能没问题,但是可能会挤在一起或者分很开,这个是能调的,因为你用了chinese.php的类,这个类是继承fpdf.php的,所以你只改chinese.php的GB_widths就行了,这是一个数组。一般是中文字体里面写英文数字和字符有这个宽度问题,所以一般在addGBFont()里面调GB_widths。

3.添加中文用addGBFont(chinese.php里面的),添加英文字体用AddBig5Font(chinese.php里面的)或者AddFont(fpdf.php里面的,推荐用这个方法加英文字体)

4.如果中文字体没添加成功的话,例如addGBFont(’abcdefg’,”,’abcdefg’)。没有字体是叫abcdefg的,或者假设是有这种字体,但是你没正确添加到项目里面,那么这里不会报错,而是会使用仿宋(还是宋体之类)的默认字体,所以不要以为没报错,输出了中文就是对的字体了。最重要的一点,如果输出的是chorme或者其他浏览器,会正确显示中文,但是也许不会正确显示字体,还是会输出宋体之类的默认字体,所以应该下载下来,然后用福昕PDF看一下字体是不是你想要的(别用wps或者office!之前用word打开,然后发现和打印出来的排版不一样,所以强烈建议看pdf用福昕或者其他专业的pdf软件,福昕打开的样子基本和打印出来的样子是一样的,无论是排版还是字体)。总的来说,添加了新的中文字体,检验是否使用成功的方法是:1.下载下来 2.用专业的PDF软件打开或者直接打印机打印出来

5.AddGBFont的时候,文件名和中文名都要写正确!不然字体也会不起作用,变成默认字体。例如字体如下
这里写图片描述

这里写图片描述

那么添加使用字体的时候应该是 pdf->AddGBFont(‘msyhl’,’微软雅黑 Light’)
如果写成pdf->AddGBFont(‘msyhl’,’微软雅黑简体’) 后面的中文名和ttf字体名称不一致,就会不起作用,大家不要偷懒啊!空格也要加上,做到一模一样,一个标点符号都别差
——————————————————网盘资源————————————————

ttf2pt1.exe & ugbk.map
https://pan.baidu.com/s/1pLqKbTT

这里我把我的demo打包放出来,里面有字体msyh(微软雅黑)和字体simhei(黑体)了,还有Chinese.php中文扩展,基本用这个能满足php生成pdf的项目要求了,把这个demo改改当成插件调用就行了(重要的事情再强调一遍,看字体是否正确要先下载,然后用专业pdf软件或者直接打印出来看!不然像我一直卡一两个月字体出不来不知道什么回事,其实是chorme浏览器有问题 T_T

http://pan.baidu.com/s/1eSGLkJo

这里放一个好用的ttc转ttf的工具,unitettc。
在操作系统上,不少中文字体都是ttc格式的,在上面的操作中我们都需要使用ttf格式的字体,那么我们就需要将ttc格式转换成ttf格式了,分解和合并的方法如下:
1.将ttc分解成ttf,只需要把ttc移到UniteTTC.exe上面就行了,然后在当前目录就会出现若干个对应被分解的ttf文件
2.将ttf合并成ttc,只需要将需要的ttf文件全部选定,然后拖到AllUniteTTC.exe,就会在当前目录出现一个对应的ttc文件

http://pan.baidu.com/s/1nvFlfCl

为了保险起见(防止网盘挂掉之类的),我把chinese.php源码放这里(如果自己从网上找的chinese.php,要记得注释掉两个set_magic_quotes_runtime,不然会报错,我这里的代码和上面的demo项目都注释掉了的):

<?php
require_once('fpdf.php');

$Big5_widths=array(' '=>250,'!'=>250,'"'=>408,'#'=>668,'$'=>490,'%'=>875,'&'=>698,'\''=>250,
    '('=>240,')'=>240,'*'=>417,'+'=>667,','=>250,'-'=>313,'.'=>250,'/'=>520,'0'=>500,'1'=>500,
    '2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>250,';'=>250,
    '<'=>667,'='=>667,'>'=>667,'?'=>396,'@'=>921,'A'=>677,'B'=>615,'C'=>719,'D'=>760,'E'=>625,
    'F'=>552,'G'=>771,'H'=>802,'I'=>354,'J'=>354,'K'=>781,'L'=>604,'M'=>927,'N'=>750,'O'=>823,
    'P'=>563,'Q'=>823,'R'=>729,'S'=>542,'T'=>698,'U'=>771,'V'=>729,'W'=>948,'X'=>771,'Y'=>677,
    'Z'=>635,'['=>344,'\\'=>520,']'=>344,'^'=>469,'_'=>500,'`'=>250,'a'=>469,'b'=>521,'c'=>427,
    'd'=>521,'e'=>438,'f'=>271,'g'=>469,'h'=>531,'i'=>250,'j'=>250,'k'=>458,'l'=>240,'m'=>802,
    'n'=>531,'o'=>500,'p'=>521,'q'=>521,'r'=>365
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值