创建合同pdf操作整理

使用TCPDF对合同的模板创建、盖章、水印、骑缝章、设置保护等操作。

目录

合同模板处理

创建html模板

模板赋值

创建目录

创建blade合同模板

变量改活

获取html内容

创建pdf文件

盖章处理

骑缝章处理

获取总页数

分割印章

设置骑缝章

水印设置

简单水印

每页水印

旋转水印

设置文档保护

方法

示例

效果

总结

参考文章


 

合同模板处理

创建html模板

创建使用制作pdf文档的html合同模板。

注意:css部分样式pdf不支持,比如浮动、悬浮等,只支持一些基本的样式设置。




    
    购销合同


购销合同

(供方)(以下简称乙方):

经协商同意,根据中华人民共和国经济法的规定,订立合同如下:

一、 产品名称、商标、型号、厂家、数量、价格、供货时间:

二、 质量要求技术标准、供方对质量负责的条件和期限:按技术协议

三、 交(提)货地点、方式:使用快递

四、 运输方式及到达站港和费用负担:送货上门、供方负担

五、 合理损耗及计算方法:无

六、 包装标准、包装物的供应与回收:原包装、不回收。

七、 验收标准、方法及提出异议期限:按原厂技术标准验收,需方收到货后提出异议期限为十五天。

八、 结算方式及期限:货到验收合格、发票到后一周内付款。

九、 违约责任:如发生质量问题,需方将提出索赔。具体事宜协商解决。

十、 解决合同纠纷的方式:合同发生争议时,双方应协商解决,协商不成时,任何一方可向经济合同仲裁委员会申请仲裁,或直接向人民法院起诉。

十一、 其它事项:本合同一式两份,双方各执一份,经双方签字盖章有效,均有法律效力。

订立合同人:

甲方: 乙方:
经办人:(盖章) 经办人:(盖章)
电话: 电话:
年月日

最下面使用表格主要是为了对齐。

效果

创建合同pdf操作整理_第1张图片

 

模板赋值

模板改活,把其中的变动的地方设置为变量,之后使用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,这样图片不会覆盖文字。

效果

创建合同pdf操作整理_第2张图片

骑缝章处理

获取总页数

$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操作整理_第3张图片

 

设置骑缝章

首先获取合同文档总页数,然后得到甲乙双方合同章分割后的图片路径,

最后进行循环设置图片。

// 获取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);
}

注意:分割后的图片尺寸与原图不同,设置后的尺寸效果可能偏大,效果需要微调。

效果:

创建合同pdf操作整理_第4张图片

 

水印设置

简单水印

可通过设置图片透明度和插入图片来设置水印

参数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);
}

效果:

创建合同pdf操作整理_第5张图片

 

设置文档保护

方法

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');

效果

不影响对方查看和复制文件,但是如果要编辑内容就需要权限密码。

 创建合同pdf操作整理_第6张图片

 

总结

使用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)_电脑培训

你可能感兴趣的:(PHP,pdf,php,tcpdf)