今天给公司做一个线上合同签约功能,用户签约后 生成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 就可以正常使用了。

如果你还遇到了其他的问题,可以在留言中给我反馈。

fpdf fpdi 操作pdf文件 写入中文汉字的更多相关文章

  1. Itext简绍及操作PDF文件

    iText简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转 ...

  2. 操作PDF文件的关键技术点

    一个PDF文档从大到小可以分成如下几个要素:文档.章节.小节.段落.表格.列表. com.lowagie.text.Document表示PDF文档.必须为它创建一个PDF写入器,即com.lowagi ...

  3. PHP文件读写操作之文件写入代码

    在PHP网站开发中,存储数据通常有两种方式,一种以文本文件方式存储,比如txt文件,一种是以数据库方式存储,比如Mysql,相对于数据库存储,文件存储并没有什么优势,但是文件读写操作在基本的PHP开发 ...

  4. vue项目中操作PDF文件

    以前从来没接触过前端要求显示PDF文件,一时之间有点懵逼,不知从哪下手啊... 无奈之下,去找度娘,方法还不少,iframe  embed  object这些标签就可以, 可是拿过来做个demo一试, ...

  5. .net通过iTextSharp.pdf操作pdf文件实现查找关键字签字盖章

    之前这个事情都CA公司去做的,现在给客户做demo,要模拟一下签字盖章了,我们的业务PDF文件是动态生成的所以没法通过坐标定位,只能通过关键字查找定位了. 之前在网上看了许多通多通过查询关键字,然后图 ...

  6. c#操作pdf文件系列之创建文件

    1.我使用的工具是vs2013,引用的第三方程序集itextpdf 具体安装方法,可以通过nuget搜索iTextSharp然后进行安装. 2具体代码如下 创建两个不同pdf文件,每个地方什么意思代码 ...

  7. Qt 操作 pdf 文件

    写了好久的东西,不小心按了下返回键就没了.CSDN居然没自动保存,坑爹啊 原本还有很多信息的,现在直入正题吧. QT没有内置PDF操作的功能(其实有一个,QPrinter,不过只能写不能读,基本是半残 ...

  8. CStdioFile.WriteString无法向文件写入中文

    CStdioFile.WriteString向文件中写入字符串,但字符串中带有中文的,无法写入. 解决方案: 将带有中文的字符串进行转换后再写入文件. char* pBuffer = NULL; lo ...

  9. itext操作PDF文件添加水印

    功能描述:添加图片和文字水印 /** * * [功能描述:添加图片和文字水印] [功能详细描述:功能详细描述] * @param srcFile 待加水印文件 * @param destFile 加水 ...

随机推荐

  1. 小米商城项目(JSP+Servlet项目)

    小米商城项目 项目已托管到GitHub,大家可以去GitHub查看下载!并搜索关注微信公众号 码出Offer 领取各种学习资料! 在这里插入图片描述 基于Servlet+JSP开发的小米商城项目,因为 ...

  2. js创建函数的方式

    一般一下这三种方式 第一种(函数声明): function sum1(num1,num2){   return num1+num2;} 没啥好说的 第二种(函数表达式): var sum2 = fun ...

  3. C++中复杂声明和定义的辨析

    0x00 前言 c++中的复杂声明往往令人无法下手,经常使人搞错这到底声明的是一个指针还是指针函数.但其实c++对于复杂声明是遵循一定的规则的,叫做变量名—>右--左-右规则. 0x01 规则解 ...

  4. day27 作业

    # 学校类 class School: #校区的名字:如"老男孩上海校区" #校区的地址:如"上海虹桥" def __init__(self,s_name,s_ ...

  5. JVM 专题十:运行时数据区(五)堆

    1. 核心概述 1.1 堆概述 一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器.本地方法栈和虚拟机栈. 一个jvm实例只存在一个堆内存 ...

  6. 机器学习实战基础(二十五):sklearn中的降维算法PCA和SVD(六) 重要接口,参数和属性总结

    到现在,我们已经完成了对PCA的讲解.我们讲解了重要参数参数n_components,svd_solver,random_state,讲解了三个重要属性:components_, explained_ ...

  7. 数据可视化之PowerQuery篇(九)巧用Power Query,Excel也可以轻松管理文档

    https://zhuanlan.zhihu.com/p/111674088 ​来自知乎一个朋友的问题,如何在Excel中批量插入文件的超链接,以便在Excel中对文档进行有序的目录管理? 这个问题的 ...

  8. 移除hmtl5 input type=“number”的step验证

    设置 step="any"例如:<input type="number" step="any" value=""& ...

  9. Spring Boot整合swagger使用教程

    目录 Swagger的介绍 优点与缺点 添加swagger 1.添加依赖包: 2.配置Swagger: 3.测试 场景: 定义接口组 定义接口 定义接口请求参数 场景一:请求参数是实体类. 场景二:请 ...

  10. 史上最全的 jmeter 获取 jdbc 数据使用的4种方法——(软件测试Python自动化)

    周五,下班了吗?软件测试人. 明天是周末了!给大家推荐一个技术干货好文.史上最全的 jmeter 获取 jdbc 数据使用的四种方法.我也精剪了jmeter的自动化接口测试的视频放在了同名UP主,周末 ...