前言:最近遇到个需求,就是按学生的报名表自动生成合同,因为涉及内容动态填充的方式,
一开始我的想法是用GD类库绘图,最后也是成功了,但是因为合同涉及很多张图片,绘制的时间会很长,用户体验极差,后来就改用了这种直接修改pdf文件的办法,效率明显上升
安装
composer命令安装:composer require setasign/fpdi
composer命令安装:composer require setasign/fpdf
中文乱码问题
问题描述
在实际操作上就出现了问题。国外的fpdf 对中文支持并不是很好,在pdf上加入中文汉字的时候,会出现乱码。而且他只提供文件夹中的几种字体。而且这几种字体都是英文字体,所以无法正常支持汉字的写入。
解决办法
1.下载代码
https://github.com/DCgithub21/cd_FPDF
2.将上一步的源码放入vendor/setasigin/PDF_Chinese文件中
3.修改vendor\setasign\fpdi\src\FpdfTpl.php, 将他基础的fpdf类改成 咱们刚才引入的代码
namespace setasign\Fpdi;
include_once "../vendor/setasign/PDF_Chinese/chinese.php";
class FpdfTpl extends \PDF_Chinese
{
use FpdfTplTrait;
}
实例
//引入类
use setasign\Fpdi\Fpdi;
use think\facade\Env;
use library\File;
/*
* $user 用户信息
* $path pdf文件路径
*/
public function pdf($user, $path)
{
$pdf = new Fpdi();
//获取页数
$pageCount = $pdf->setSourceFile($path);
$pdf->AddGBFont('simhei', '黑体');
$pdf->SetFont('simhei', '', 12);
//遍历所有页面
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
//导入页面
$templateId = $pdf->importPage($pageNo);
//简单的创建页面
$pdf->AddPage();
/*复杂的创建页面
//获取导入页面的大小
$size = $pdf->getTemplateSize($templateId);
//创建页面(横向或纵向取决于导入的页面大小)
if ($size['width'] > $size['height']){
$pdf->AddPage('L', array($size['width'], $size['height']));
}else {
$pdf->AddPage('P', array($size['width'], $size['height']));
}
*/
// 在新增的頁面上使用引入的第$pageNo页
$pdf->useTemplate($templateId);
/*添加水印
if($type == 1){//文字水印
//设置字体
//$pdf->SetFont('Arial','B','24');
$family = ['courier', 'helvetica', 'times', 'symbol', 'zapfdingbats'];
$pdf->SetFont('helvetica','U','50');
//设置位置 - 加在中间位置
$center_x = $size['width']/2;
$center_y = $size['height']/2;
$pdf->SetXY($center_x, $center_y);
//写入水印 - 中文会乱码可以用iconv("utf-8","gbk",'内容')转换编码格式
$pdf->Write(7, 'ROOT_ICO');
}else{//图片水印
$center_x = $size['width']/2 - 40;
$center_y = $size['height']/2;
$pdf->image("xxxx.png", $center_x, $center_y, 80, 0);//中间水印
$pdf->image("xxxx.png", 0, 0,210);//全屏背景水印
}
*/
// 第一页
if ($pageNo == 1) {
// 应缴纳总费用
$pdf->SetTextColor(0, 0, 0);//字体颜色
$pdf->SetXY(75, 179);//xy定位
$pdf->Write(5, $user['pay']);
...