最近在做项目有个需求,项目中需要根据设置的html合同模板自动生成PDF合同供客户下载签署,并根据回传的已签署合同尾页来替换原来未签署合同的尾页,合成新的已签署合同文本。
读取两个PDF文件并合成的 具体代码记录如下:
use setasign\Fpdi\Fpdi;
use think\Image;
/*
* 读取pdf文件 并合成pdf页面
* $filename: 原始pdf文件
* $type: 生成pdf的类型 I:直接预览PDF文件 F:PDF文件保存到本地 S:返回PDF文件流 D:直接下载PDF文件
* $add_filePath: 附件文件路径 可为图片或者pdf页面
* $add_type:add 添加新的pdf页面 edit 替换最后一页pdf文件
* $newfilename: 生成的新文件名 如果不存在默认替换原始文件
*/
function readPDF($filename, $type='I', $add_filePath='', $add_type='add', $newfilename=''){
// 加载现有的PDF文件
$pdf = new FPDI();
$pageCount = $pdf->setSourceFile($filename);
//unlink($filename);//删除生成的初始pdf文件
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
// 导入页面
$templateId = $pdf->importPage($pageNo);
$size = $pdf->getTemplatesize($templateId);
$pdf->AddPage($size['orientation'], [$size['width'], $size['height']]);
// 填充页面
$pdf->useTemplate($templateId);
// $add_filePath = 'storage/business/seal/img/zhang.png';
if($add_filePath){//需要合成图片 替换最后一页的pdf页面
if ($pageNo == $pageCount && $add_type=='edit') {//210 297
//替换最后一页PDF页面
// $a = getimagesize($add_filePath);
$pdf->Image($add_filePath, 0, 0, $size['width'], $size['height']); //
}
}
}
if( $add_type=='add'){//附加PDF文件
if($add_filePath) {//需要合成图片 新加一个页面
$pdf->AddPage();//新添加页面
// 填充页面
$pdf->Image($add_filePath, 0, 0, $size['width'], $size['height']); //
}
}
if($newfilename){
$filename = $newfilename;
}
// 保存PDF
$pdfContent = $pdf->Output($filename, $type, true);//I:直接预览PDF文件、 D:直接下载PDF文件 F:PDF文件保存到本地 S:返回PDF文件流
if ($type == 'S') {
$pdfContent = base64_encode($pdfContent);
return $pdfContent;
}
if($type == 'I'){
exit;
}
return '';
}
配置:
1、加载包文件:
composer require setasign/fpdi