创建合同pdf操作整理

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

目录

合同模板处理

创建html模板

模板赋值

创建目录

创建blade合同模板

变量改活

获取html内容

创建pdf文件

盖章处理

骑缝章处理

获取总页数

分割印章

设置骑缝章

水印设置

简单水印

每页水印

旋转水印

设置文档保护

方法

示例

效果

总结

参考文章


 

合同模板处理

创建html模板

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

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>购销合同</title>
</head>
<body>
<div class="content">
    <h3 align="center">购销合同</h3>
    <p>(供方)(以下简称乙方):</p>
    <p>经协商同意,根据中华人民共和国经济法的规定,订立合同如下:</p>
    <p>一、 产品名称、商标、型号、厂家、数量、价格、供货时间:</p>
    <p>二、 质量要求技术标准、供方对质量负责的条件和期限:按技术协议</p>
    <p>三、 交(提)货地点、方式:使用快递</p>
    <p>四、 运输方式及到达站港和费用负担:送货上门、供方负担</p>
    <p>五、 合理损耗及计算方法:无</p>
    <p>六、 包装标准、包装物的供应与回收:原包装、不回收。</p>
    <p>七、 验收标准、方法及提出异议期限:按原厂技术标准验收,需方收到货后提出异议期限为十五天。</p>
    <p>八、 结算方式及期限:货到验收合格、发票到后一周内付款。</p>
    <p>九、 违约责任:如发生质量问题,需方将提出索赔。具体事宜协商解决。</p>
    <p>十、 解决合同纠纷的方式:合同发生争议时,双方应协商解决,协商不成时,任何一方可向经济合同仲裁委员会申请仲裁,或直接向人民法院起诉。</p>
    <p>十一、 其它事项:本合同一式两份,双方各执一份,经双方签字盖章有效,均有法律效力。</p>
    <p>  </p>
    <p>订立合同人:</p>
    <table>
        <tr height="45px">
            <td>甲方:</td>
            <td width="100px"></td>
            <td>乙方:</td>
        </tr>
        <tr height="45px">
            <td>经办人:(盖章)</td>
            <td width="100px"></td>
            <td>经办人:(盖章)</td>
        </tr>
        <tr height="45px">
            <td>电话: </td>
            <td width="100px"></td>
            <td>电话:</td>
        </tr>
        <tr height="45px">
            <td></td>
            <td width="100px"></td>
            <td>年月日</td>
        </tr>
    </table>
</div>
</body>
</html>

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

效果

 

模板赋值

模板改活,把其中的变动的地方设置为变量,之后使用laravel赋值变量并提取出html字符串内容。

创建目录

在views中创建test目录。

 

创建blade合同模板

创建laravel框架blade格式的合同模板,这样可使用框架方法来赋值和提取赋值后的html内容。

变量改活

可设置一些不固定的内容为变量;比如:甲方、乙方、经办人、年月日设置为变量。

<table>
    <tr height="45px">
        <td>甲方:{{$from_company_name}}<br></td>
        <td width="100px"></td>
        <td>乙方:{{$to_company_name}}<br></td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
    </tr>
    <tr height="45px">
        <td>经办人:{{$from_user_name}}(盖章)<br></td>
        <td width="100px"></td>
        <td>经办人:{{$to_user_name}}(盖章)<br></td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
    </tr>
    <tr height="45px">
        <td>电话: {{$from_user_phone}}<br></td>
        <td width="100px"></td>
        <td>电话:{{$to_user_phone}}<br></td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
    </tr>
    <tr height="45px">
        <td></td>
        <td width="100px"></td>
        <td>{{$date}}</td>
    </tr>
</table>

获取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)_电脑培训

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
抖音是一款热门的短视频应用,很多用户都希望了解如何操作抖音,因此整理一份SOP(Standard Operating Procedure,标准操作规程)PDF文件是很有必要的。 操作抖音的SOP PDF文件应该包含以下几个方面的内容: 1. 注册与登录:详细介绍如何在抖音上注册账号,并说明如何使用手机号或第三方平台账号登录。 2. 主页设置:教用户如何设置用户名、头像、个人简介等信息,以及如何关注感兴趣的用户和话题。 3. 录制和发布视频:详细介绍如何录制、编辑和发布视频。包括如何使用滤镜、特效、配乐,以及如何添加文字、标签和地理位置等。 4. 音乐库和挑选配乐:介绍抖音的音乐库功能,并指导用户如何挑选适合的音乐来配合自己的视频内容。 5. 互动功能:介绍抖音的互动功能,包括点赞、评论、分享和私信等,以及如何与其他用户互动。 6. 隐私设置:详细介绍如何设置抖音的隐私权限,以保护用户的个人信息和视频内容的安全。 7. 发现和关注:指导用户如何通过抖音的推荐算法来发现新的内容和用户,并说明如何关注自己感兴趣的用户和话题。 8. 网红经济:简要介绍抖音的网红经济,包括如何通过抖音赚取收入、如何提高影响力等。 9. 常用功能:列举一些常用的功能和快捷操作,如搜索、分享到其他平台、保存视频等。 以上是关于抖音操作的SOP整理PDF的大致内容。通过一份详细的操作指南,用户可以更好地了解和掌握抖音的使用方法,从而更好地享受这款短视频应用的乐趣。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值