使用TCPDF对合同的模板创建、盖章、水印、骑缝章、设置保护等操作。
目录
合同模板处理
创建html模板
模板赋值
创建目录
创建blade合同模板
变量改活
获取html内容
创建pdf文件
盖章处理
骑缝章处理
获取总页数
分割印章
设置骑缝章
水印设置
简单水印
每页水印
旋转水印
设置文档保护
方法
示例
效果
总结
参考文章
合同模板处理
创建html模板
创建使用制作pdf文档的html合同模板。
注意:css部分样式pdf不支持,比如浮动、悬浮等,只支持一些基本的样式设置。
购销合同
购销合同
(供方)(以下简称乙方):
经协商同意,根据中华人民共和国经济法的规定,订立合同如下:
一、 产品名称、商标、型号、厂家、数量、价格、供货时间:
二、 质量要求技术标准、供方对质量负责的条件和期限:按技术协议
三、 交(提)货地点、方式:使用快递
四、 运输方式及到达站港和费用负担:送货上门、供方负担
五、 合理损耗及计算方法:无
六、 包装标准、包装物的供应与回收:原包装、不回收。
七、 验收标准、方法及提出异议期限:按原厂技术标准验收,需方收到货后提出异议期限为十五天。
八、 结算方式及期限:货到验收合格、发票到后一周内付款。
九、 违约责任:如发生质量问题,需方将提出索赔。具体事宜协商解决。
十、 解决合同纠纷的方式:合同发生争议时,双方应协商解决,协商不成时,任何一方可向经济合同仲裁委员会申请仲裁,或直接向人民法院起诉。
十一、 其它事项:本合同一式两份,双方各执一份,经双方签字盖章有效,均有法律效力。
订立合同人:
甲方: |
|
乙方: |
经办人:(盖章) |
|
经办人:(盖章) |
电话: |
|
电话: |
|
|
年月日 |
最下面使用表格主要是为了对齐。
效果
模板赋值
模板改活,把其中的变动的地方设置为变量,之后使用laravel赋值变量并提取出html字符串内容。
创建目录
在views中创建test目录。
创建blade合同模板
创建laravel框架blade格式的合同模板,这样可使用框架方法来赋值和提取赋值后的html内容。
变量改活
可设置一些不固定的内容为变量;比如:甲方、乙方、经办人、年月日设置为变量。
甲方:{{$from_company_name}}
|
|
乙方:{{$to_company_name}}
|
|
|
|
经办人:{{$from_user_name}}(盖章)
|
|
经办人:{{$to_user_name}}(盖章)
|
|
|
|
电话: {{$from_user_phone}}
|
|
电话:{{$to_user_phone}}
|
|
|
|
|
|
{{$date}} |
获取html内容
进行模板赋值,获取赋值后的html内容字符串。
代码如下:
$data = [
'from_company_name' => '北京XXX有限公司',
'from_user_name' => '张三',
'from_user_phone' => '13800000000',
'to_company_name' => '北京OOO有限公司',
'to_user_name' => '李四',
'to_user_phone' => '18211111111',
'date' => date('Y年m月d日')
];
$html = view('test.hetong', $data)->render();
创建pdf文件
调用tcpdf来创建pdf文件并加入通过laravel获取的动态html字符串内容。
$pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
// 设置文档信息
$pdfName = '测试合同';
$pdf->SetCreator($pdfName);
$pdf->SetAuthor('YJL');
$pdf->SetTitle($pdfName);
$pdf->SetSubject($pdfName);
// 去掉默认的页头页脚。比如那个横线
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->setFontSubsetting(false);
// 设置间距 页面间隔
$pdf->SetMargins(10, 5, 10, true);
//设置字体 stsongstdlight支持中文
$pdf->SetFont('msyh', '', 10);
// 设置图片比例因子
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
// 设置自动分页 距离底部多少进行分页
$pdf->SetAutoPageBreak(true, PDF_MARGIN_BOTTOM);
// 第一页
$pdf->AddPage();
// 得到赋值后的html字符串
$data = [
'from_company_name' => '北京XXX有限公司',
'from_user_name' => '张三',
'from_user_phone' => '13800000000',
'to_company_name' => '北京OOO有限公司',
'to_user_name' => '李四',
'to_user_phone' => '18211111111',
'date' => date('Y年m月d日')
];
$html = view('test.hetong', $data)->render();
//$pdf->writeHTML($html, $ln = true, $fill = false, $reseth = false, $cell = false, $align = '1');
$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '1', true);
// 四种模式 I输出、D下载、F保存本地、S输出二进制字符串
$pdf->Output('test.pdf', 'I');
注意:
writeHTML方法也可插入html内容到pdf,但是插入图片需要改为writeHTMLCell方法。
盖章处理
盖章处理使用tcpdf插入图片操作,具体坐标因为暂时没找到怎么获取关键字坐标,只能是人工调试坐标位置,固定坐标插入。
需要准备好相应的章文件图片,需要是png透明背景的图片。
在$pdf->writeHTMLCell后插入图片
$pdf->Image('./images/contract2.png', 20, 160, 35, 35, 'PNG', '', '1', true, 300);
$pdf->Image('./images/contract2.png', 110, 160, 35, 35, 'PNG', '', '1', true, 300);
注意dpi设置为300,这样图片不会覆盖文字。
效果
骑缝章处理
获取总页数
$page_num = $pdf->getPage();
// 或者
$page_num = $pdf->PageNo();
分割印章
需要把印章图片根据合同页数进行分割,从网上找了一个分割图片的方法,在原来基础上修改了返回,增加了保存路径设置。
/**
* 被切割的图片必须是.png结尾的
* 如果是jpg或者其他格式
* 下面的某些函数就需要替换
* @param $filename:图片路径
* @param $num_pages:要分割后图片张数/合同文件的页数
* @param $dirName:图片保存文件夹
* @return array
*/
public static function cuttingImg($filename, $num_pages, $dirName)
{
// 由文件URL 创建一个新图像
$image = imagecreatefrompng($filename);
// 获取尺寸
list($width, $height, $type, $attr) = getimagesize($filename);
$offset = ceil($width / $num_pages);
$maxW = $offset;
$maxH = $height;
$widthnum = $num_pages;
$heightnum = 1;
$dir_src = './uploads/tmp/'.$dirName.'/';
// 创建文件夹
if(!file_exists($dir_src)) {
mkdir($dir_src, 0777);
}
$img_srcs = [];
for ($i = 0; $i < $heightnum; $i++) {
for ($j = 0; $j < $widthnum; $j++) {
// 新建一个真彩色图像
$iOut = imagecreatetruecolor($maxW, $maxH);
// 为图像分配颜色
$bg = imagecolorallocatealpha($iOut, 0, 0, 0, 127);
imagealphablending($iOut, false);
// 填充
imagefill($iOut, 0, 0, $bg);
// 设置保存PNG时 保留透明通道
imagesavealpha($iOut, true);
// 复制图片的一部分
imagecopy($iOut, $image, 0, 0, ($j * $maxW), ($i * $maxH), $maxW, $maxH);
$cutting_img_src = $dir_src . $i . '_' . $j . '.png';
if (imagepng($iOut, $cutting_img_src)) {
$img_srcs[] = $cutting_img_src;
}
}
}
return $img_srcs;
}
效果:
设置骑缝章
首先获取合同文档总页数,然后得到甲乙双方合同章分割后的图片路径,
最后进行循环设置图片。
// 获取pdf文档页数
$page_num = $pdf->getPage();
// 得到分割后的印章图片路径
$from_imgs = self::cuttingImg('./images/contract2.png', $page_num, 'from');
$to_imgs = self::cuttingImg('./images/contract3.png', $page_num, 'to');
for ($i = 0; $i < $page_num; $i++) {
$pdf->setPage($i+1);
$pdf->Image($from_imgs[$i], 190, 80, 20, '', 'png', '', '', false, 300);
$pdf->Image($to_imgs[$i], 190, 160, 20, '', 'png', '', '', false, 300);
}
注意:分割后的图片尺寸与原图不同,设置后的尺寸效果可能偏大,效果需要微调。
效果:
水印设置
简单水印
可通过设置图片透明度和插入图片来设置水印
参数1-2:xy轴坐标
参数3-4:图片宽高,不设置为图片默认宽高。
$pdf->SetAlpha(0.4);
$pdf->Image('./images/water_img.png', 50, 100, 0, 0);
每页水印
获取总页数
$page_num = $pdf->getPage();
循环设置水印
for ($i = 1; $i <= $page_num; $i++) {
$pdf->setPage($i);
$pdf->SetAlpha(0.3);
$pdf->Image('./images/water_img.png', 50, 100);
}
旋转水印
通过pdf Rotate方法来设置图片旋转
三个参数:
Angle:旋转角度
x:横坐标
y:纵坐标
代码如下:
// 获取pdf文档页数
$page_num = $pdf->getPage();
// 设置水印
for ($i = 1; $i <= $page_num; $i++) {
$pdf->setPage($i);
$pdf->SetAlpha(0.4);
// 旋转角度
$pdf->Rotate(20, 30, 50);
$pdf->Image('./images/water_img.png', 30, 50, 0, 10);
$pdf->Image('./images/water_img.png', 10, 150, 0, 10);
$pdf->Image('./images/water_img.png', -10, 250,0, 10);
}
效果:
设置文档保护
方法
SetProtection($permissions=array('print', 'modify', 'copy', 'annot-forms', 'fill-forms', 'extract', 'assemble', 'print-high'), $user_pass='', $owner_pass=null, $mode=0, $pubkeys=null)
参数:
Permissions 准许操作
user_pass:顾名思义,用户密码
owner_pass:权限密码
Mode:加密方式
Pubkeys:包含公钥证书('c')和权限('p')的收件人数组
示例
设置无法修改,权限密码为123456yjl
$pdf->SetProtection(['modify'], '', '123456yjl');
效果
不影响对方查看和复制文件,但是如果要编辑内容就需要权限密码。
总结
使用tcpdf结合html创建pdf文件很简单,主要麻烦在于html样式和pdf样式兼容问题,有些pdf是不支持的;还有pdf文件的尺寸与html尺寸问题不能换算。研究tcpdf应用pdf有很长一段时间了,还是有一个问题没法解决,就是如何获取pdf关键字坐标?倒是用python可以获取pdf文档关键字坐标,但是还是尺寸问题无法换算。
参考文章
PHP html生成pdf 并且加上电子骑缝章_电子印章 php_@土豆子的博客-CSDN博客
Tcpdf不使用css来实现线上合同和签章,图片悬浮_tcpdf 水印_vinter-he的博客-CSDN博客
PHP通过TCPDF生成PDF,合同实现在线签署_php 在线合同_Liu Zhaohe的博客-CSDN博客
如何在tcpdf中添加带有图像和文字180度旋转的div(How to add a div with image and text 180 degree rotate in tcpdf)_电脑培训