fpdf fpdi 操作pdf文件 写入中文汉字
作者:互联网
今天给公司做一个线上合同签约功能,用户签约后 生成pdf版的文件 。网上搜了搜大概都是用fpdf进行操作的 ,
通过fpdi 可以进行读取pdf模板。 在通过继承fpdf 操作现有的pdf文档 。
功能很简单,用户手写用页面canvas生成图片,图片保存png到服务器 。然后粘贴图片到对应的pdf模板上。
但是在实际操作上就出现了问题。国外的fpdf 对中文支持并不是很好,在pdf上加入中文汉字的时候,会出现乱码。
而且他只提供文件夹中的几种字体。而且这几种字体都是英文字体,所以无法正常支持汉字的写入。
下面说一下具体的解决方案:
1. https://github.com/DCgithub21/cd_FPDF 下载代码
2. 将上一步的源码放入vendor中
3. 修改composer源码 修改 fpdi中的 fpdfTpl.php 将他基础的fpdf类改成 咱们刚才引入的代码 而之前引入的代码再继承fpdf
4.编写相关代码
/** * 合成pdf * @param $sgin_img * @param $order_sn * @return string * @throws \setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException * @throws \setasign\Fpdi\PdfParser\Filter\FilterException * @throws \setasign\Fpdi\PdfParser\PdfParserException * @throws \setasign\Fpdi\PdfParser\Type\PdfTypeException * @throws \setasign\Fpdi\PdfReader\PdfReaderException */ public function pdf($sgin_img,$order_sn,$orderInfo){ $sgin_img=ROOT_PATH.'public/'.$sgin_img; $name=$order_sn; $outputPath=ROOT_PATH.'public/uploads/pdf/'.$name.'.pdf'; $url='/uploads/pdf/'.$name.'.pdf'; $pdf=new Fpdi(); $pdf->AddPage(); $pdf->setSourceFile('UI.pdf'); //设置模板文件 $template = $pdf->importPage(1); $pdf->useTemplate($template); $count=mb_strlen($orderInfo['order_name']); $x=81+2.5*(9-$count); //计算宽度 /*写入项目名称*/ $pdf->SetTextColor(0, 0, 0); $pdf->SetXY($x, 67); // $pdf->SetFont($font_path); $pdf->AddGBFont('songti'); //使用字体 $pdf->SetFont('songti','',13); //注意此处一定要用iconv改一下编码 我之前没有想到这个 浪费很多时间 $pdf->Write(0,iconv("utf-8","gbk",$orderInfo['order_name'])); /*添加签名图片*/ $pdf->Image($sgin_img,50,130,50,0); $pdf->Output($outputPath,'F'); return $url; }
展示一下生成的效果:
有可能你还会遇见其他的问题 :还是字体问题 上面贴的github中有一个黑体字体 ,但是你可能需要其他的字体
比如说我用的是宋体 。而fpdf中是有自己的字体库的 只能应用库中的 字体,这里可能还需要我们自己生产字体库,
网上也有相关的方法 这里我发一下比较简单便捷的。
通过访问 http://www.fpdf.org/makefont/ 这里地址 就可以生产所需要的字体库 图片如下:
将两个文件放入到对应的font文件夹中, 引入的时候 在Addfont 就可以正常使用了。
如果你还遇到了其他的问题,可以在留言中给我反馈。
标签:fpdi,fpdf,name,img,Fpdi,pdf,throws 来源: https://www.cnblogs.com/sgj123/p/13405752.html