前言:最近遇到个需求,就是按学生的报名表自动生成合同,因为涉及内容动态填充的方式,
一开始我的想法是用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']);
// 费用名称
$pdf->SetXY(25, 210);
$pdf->Write(5,iconv("utf-8","gbk",$user['title']));
} else if($pageNo == 2) {
}
}
$fileName = time().'.pdf';
if (strtoupper(substr(PHP_OS,0,3)) === 'WIN') {
$url = Env::get('ROOT_PATH')."public\uploads\contract\\".$fileName;
} else {
$url = Env::get('ROOT_PATH').'public/uploads/contract/'.$fileName;
}
//I输出output,D下载download,F保存file_put_contents,S返回return
// 輸出成本地端 PDF 檔案
$pdf->Output('F', $url);
//将文件上传至七牛云
$res = File::save($fileName,file_get_contents($url));
if($res) {
// 删除本地文件
@unlink($url);
return $res['url'];
}else{
return false;
}
}
常见问题
错误:Function get_magic_quotes_gpc() is deprecated
解决:修改\vendor\setasign\PDF_Chinese\fpdf.php位置代码
if(get_magic_quotes_runtime()) @set_magic_quotes_runtime(0);
1
改为
if(@ini_get("magic_quotes_runtime")) @ini_set("magic_quotes_runtime",0);
1
错误:Undefined index: GB_widths
解决:修改\vendor\setasign\PDF_Chinese\chinese.php位置代码
添加代码
global $Big5_widths, $GB_widths;
1
结果