创建合同pdf操作整理

news2024/9/25 9:32:47

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins部署报错问题:已解决

一.Jenkins不能下载插件 报错sun.security.provider.certpath.SunCertPathBuilderException sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat sun.security.provider.certpath.SunCertPathBuild…

学习英语给你带来了哪些机会?

昨天文章发出后&#xff0c;J姐姐给予了一些更正&#xff0c;我希望将来也能够像她那样走出去看一看。 Y呢&#xff0c;并不是我说的那样混日子&#xff0c;了解更多之后&#xff0c;才发现他是个王者&#xff0c;顿时肃然起敬。 “一起学英语”群里大佬云集&#xff0c;希望他…

【MySQL】一文带你了解SQL

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…

《嵌入式系统设计师教程 (第2版)》学习笔记

嵌入式系统设计师教程 (第2版).pdf》链接&#xff1a;https://download.csdn.net/download/AnChenliang_1002/87864728 该资源在上传时涉及到版权问题无法上传&#xff0c;所以保留该资源仅为了日后查看时博主自己可以下载&#xff1b; 本文用来记录在学习《嵌入式系统设计师…

三亚旅拍及游玩

可选景点 ⬇️①蜈支洲岛&#xff1a;各种各样的海上项目都有&#xff0c;海岛很美&#xff0c;被称作中国马尔代夫&#xff08;144元&#xff09; ⬇️②后海村&#xff1a;很适合新手学习冲浪&#xff08;免费&#xff09; ⬇️⑤西岛&#xff1a;一座安静的文艺小岛&…

2023年6月17号英语四六级考试倒计时,这些考前准备事项一定要注意

2023年6月全国大学英语四六级考试将于6月17日&#xff08;本周六&#xff09;举行&#xff0c;冰雪为大家总结了四六级考前及考中注意事项&#xff0c;供同学们参考&#xff01; 考试时间 四级考试时间&#xff1a;6月17日上午9:00-11:20 六级考试时间&#xff1a;6月17日下午1…

爆肝整理,3个月从功能进阶自动化测试,一跃成测试卷王...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 首先先了解自动化…

GPT-4(THUDM) + LangChain >> Personalized expert AI assistant.(本地知识库教程)

GPT-4(THUDM) Langchain &#xff1e;&#xff1e; Personalized expert AI assistant. Langchain. GPT-4 LangChain简介 - 知乎 (zhihu.com) 利用LangChain和国产大模型ChatGLM-6B实现基于本地知识库的自动问答_哔哩哔哩_bilibili Github地址&#xff1a; https://github.c…

10个最佳WooCommerce电商网站测量价格计算器插件

您销售的产品需要根据大小、重量、尺寸、面积或体积定价&#xff1f;查看我们的热门WooCommerce跨境电商测量价格计算器插件列表&#xff0c;以及如何设置它们。你的客户可以轻松计算和接收定制或尺寸产品等的即时定价。 定价是任何在线商店的基本特征。就其本身而言&#xff…

ECC算法学习

ECC 一、ECC简介优缺点运用 二、算法理论基础1. 椭圆曲线的加法2. 椭圆曲线的二倍运算3. 同余运算4. 有限域5. 乘法逆元 三、算法公式1、有限域的负元2、有限域的加法&#xff0c; P Q P Q PQ3. 斜率计算&#xff08;PQ即要计算P点切线&#xff0c;需要求导&#xff09;4. 椭…

【Linux】通过 Shell 脚本修改用户密码

1. Linux 中修改用户密码 Linux 中要修改一个用户的密码通常是使用 passwd 命令来完成&#xff0c;命令格式如下。 #一般使用格式 passwd [username][注]&#xff1a;若其后不加任何用户名则表示修改当前用户的密码。 使用示例&#xff1a; 这里笔者将 im 用户的密码修改为 im…

简单的提示词操作融合微调 AI 图像

本文旨在帮助我们理解和运用稳定扩散技术对AI生成图像进行精确调整。通过本文将学习如何调整关键词的强度、消除不需要的对象以及如何混合两个关键词。 Stable Diffusion 可以直接下载秋叶大神一键安装包进行使用&#xff0c;也可以直接下git上原生下载自己部署。 百度链接 …

什么是低代码(Low-Code)?

现如今&#xff0c;我们已全面迈入智能互联网时代&#xff0c;新的技术不断迭代问世&#xff0c;也代表着新的生产力不断深入我们的生活&#xff0c;同时也是开创未来最好的原动力。那就眼下而言&#xff0c;什么样的新技术才能真正解放IT生产力&#xff0c;加速社会数字化转型…

2023/06/12 产品经理常用技术名词记录

PM懂点技术总是好的吧&#xff0c;还是要能听懂简单的专业名词。遇到就更新… — 前端 \color{green}{前端} 前端— H5 即HTML5&#xff0c;第五代超文本标记语言。泛指H5广告&#xff0c;是一种借助微信传播的营销形式。 H5页面是传统桌面网站的轻量级版本&#xff0c;支持…

Linux uinput

Linux Uinput 是一个模拟用户输入事件的内核驱动程序&#xff0c;它允许用户空间程序通过创建虚拟输入设备节点来生成模拟输入事件&#xff0c;这些事件可以是键盘、鼠标、触摸屏或其他输入设备的事件。此外&#xff0c;Uinput 还可以为虚拟输入设备设置各种属性&#xff0c;并…

U-Mail邮件系统多重措施保障用户信息安全 防范邮件泄密

电子邮件由于其具有较高的便捷性与高效性&#xff0c;已逐渐成为党政机关和企业工作人员内部联系和业务交流的主要方式之一。但其带来的诸多安全问题也引发了越来越多人的关注&#xff0c;其中最最严重的威胁是邮件泄密问题。就在刚刚过去的2022年国内外都发生了多起电子邮件造…

倍福工控机维修控制器主机维修C5102-0060

常见故障分类&#xff1a; 1、磨损性故障。由于机械正常磨损造成的故障。 2、操作故障。由于操作错误、操作不当造成的故障。 3、固有的薄弱性故障。由于设计问题&#xff0c;在正常使用时产生的故障。 工控机内部温度过高。在需长时间高温运行的环境中&#xff0c;计算机各…

从微观世界的RST包文视角助力企业网络应用故障排查和优化

1. 前言 随着互联网的普及和发展&#xff0c;各行业的业务和应用越来越依赖于网络。然而&#xff0c;网络环境的不稳定性和复杂性使得出现各种异常现象的概率变得更高了。这些异常现象会导致业务无法正常运行&#xff0c;给用户带来困扰&#xff0c;甚至影响企业的形象和利益。…

使用Appium 测试微信小程序和微信公众号方法

由于腾讯系QQ、微信等都是基于腾讯自研X5内核&#xff0c;不是google原生webview&#xff0c;需要打开TBS内核Inspector调试功能才能用Chrome浏览器查看页面元素&#xff0c;并实现Appium自动化测试微信小程序和微信公众号。 前提条件Appium环境搭建&#xff0c;这里不多说了&…

银行的程序员需要了解的一些简单知识

学习《简明银行会计 程序员视角》 会计与银行会计什么是会计&#xff1f;会计假设包括哪些内容&#xff1f;商业银行的业务分类&#xff1f;商业银行的运作过程&#xff1f;银行降准会产生什么效果&#xff1f; 左右开弓的记账法什么是会计恒等式&#xff1f;什么是T字图&#…