先上效果

运用到的技术vue-pdf

setasign/fpdf

setasign/fpdi

vue-esign

前端实现

pdf封装

v-for="i in numPages"

:key="i"

:src="src"

:page="i"

style="display: block; width: 100%; border-bottom: 1px solid;"

class="pdf-page"

>

import pdf from "vue-pdf";

export default {

props: ['url'],

components: {

pdf

},

data() {

return {

src: "",

numPages: undefined

};

},

watch: {

numPages: function(){

this.$nextTick(() => {

console.log('success')

})

}

},

mounted() {

this.src = pdf.createLoadingTask(this.url);

this.src.promise.then(pdf => {

this.numPages = pdf.numPages;

this.$emit('closeLoadding', false)

});

}

};

使用 + 签名

{{ title }}

contact No: {{ trno }}

签字: 请在下面进行签字

ref="signature"

:width="800"

:height="230"

:isCrop="isCrop"

:lineWidth="lineWidth"

:lineColor="lineColor"

:bgColor.sync="bgColor"

/>

清除

确认

import vueEsign from "vue-esign";

import { Message } from 'element-ui';

import { contractSign } from "@/api/web";

import Pdf from "@/components/Pdf/Index"

export default {

components: { Pdf, vueEsign },

props: ['showNext', 'contract_pdf_url'],

data() {

return {

title: "Talk 100",

trno: "TRCN-0007776669",

src: null,

numPages: 6,

isCrop: false,

positionX: 0,

positionY: 0,

lineColor: "#000000",

bgColor: "",

lineWidth: 6,

signatureImg: "",

loadding: true

};

},

methods: {

confirm() {

this.$refs.signature

.generate()

.then(res => {

this.signatureImg = res

this.$refs.signature.reset();

this.$emit('update:showNext', 1)

})

.catch(err => {

Message.error(err)

});

},

restore() {

this.$refs.signature.reset();

this.showNext = false

},

savePdf() {

return new Promise((resolve) => {

contractSign({sign: localStorage.getItem('sign'), img: this.signatureImg}).then( r => {

if( r.code == 200) {

resolve()

}

})

})

},

/**

* 控制整个页面的显示

*/

closeLoadding(isShowLoadding) {

this.loadding = isShowLoadding

}

}

};

html {

font-size: 20px;

}

body {

font-size: 16px;

}

.header {

h2 {

width: 100%;

text-align: center;

}

.no {

float: right;

margin-right: 2rem;

clear: both;

}

.prompt {

color: #33363b;

}

}

.pdfContainer {

.pdf {

position: relative;

margin-top: 3rem;

margin-left: 20%;

span {

display: block;

width: 60% !important;

left: 5rem;

}

img {

width: 400px;

height: 120px;

position: absolute;

right: 150px;

bottom: 50px;

}

}

.signature {

border: 1px solid springgreen;

width: 80%;

margin: 0px auto;

canvas {

width: 100%;

}

.el-divider--horizontal{

margin: 24px 0 0 0;

}

}

}

前端主要进行pdf渲染到页面中,然后我们通过组件vue-esign得到一个签字画版,当签字确认后,我们可以通过方法generate()来得到一张签名图,由此我们将图片添加dom节点导pdf中

同时进行将图片传递给后端

后端实现

核心方法如下public function contractPdf($sign_img, $user_id, $app_id)

{

# 处理上传的图片

# 企业合同地址

$train = (new CorpService())->getTrain($app_id, $user_id);

$pdf_path = $this->createContractPdf(Arr::get($train, 'contract_path'));

$file = str_replace('data:image/png;base64,', '', $sign_img);

$file = base64_decode($file);

$filename = storage_path("temp/" . Str::random(40) . '.' . "png");

file_put_contents($filename, $file);

# 保存pdf

$pdf = new Fpdi();

$pageCount = $pdf->setSourceFile($pdf_path);

for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++){

$templateId = $pdf->importPage($pageNo);

$size = $pdf->getTemplateSize($templateId);

if ($size['width'] > $size['height']){

$pdf->AddPage('L', array($size['width'], $size['height']));

}else {

$pdf->AddPage('P', array($size['width'], $size['height']));

}

$pdf->useTemplate($templateId);

if($pageNo == $pageCount) {

$w = $size['width']/5;

$h = $size['height']/5;

$center_x = $w * 3.5; $center_y = $h * 4;

$pdf->image($filename, $center_x, $center_y, 80);//中间水印

}

}

$end_path = "contract/$user_id.pdf";

$pdf->Output('F',storage_path("$end_path"),false);

# 删除临时文件

Storage::delete($filename);

return $end_path;

}

将签字后的图片进行保存写入pdf中,完成整个操作链

本文由 邓尘锋 创作,采用 知识共享署名4.0 国际许可协议进行许可

本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名

最后编辑时间为: Mar 22, 2021 at 04:47 pm

php在线图片签名,ElementUi+Vue+Php+fpdf+fpdi 实现文档在线签订(图片水印、手写签名)...相关推荐

  1. java imageio删除图片_Java 提取、替换、删除PDF文档中的图片

    在一篇文章里,配有与文本信息相得益彰的图片,不仅能够活跃与美化版面,同时也有利于提高文章的可读性和阅读效果,从而增强其吸引力.同时,对文档中已存在图片的处理也尤为重要.本文将通过使用Java程序来演示 ...

  2. python批量读取图片并复制入word_提取出 Word 文档里的图片 并利用 python 批量转换格式...

    日常工作中,你是否遇到过这样的场景,领导发来一份 Word 文档,要求你将文档中的图片存储到一个文件夹内,并且还要将图片都改成 .jpg 或者 .png,你会怎么办?你是不是一边内心崩溃,一边开始一张 ...

  3. Word文档怎样添加图片?技巧分享!怎么在Word文档中加入图片?

    我们经常会在生活中工作中使用word文档来编辑一些文本信息,从而记录一些文字内容,我们在使用word文档来编辑文字信息的时候,感觉都是文字内容太过于单调,我们想要在文档中添加图片,那么究竟该如何操作呢 ...

  4. python下载图片到文件夹_python实现解析markdown文档中的图片,并且保存到本地~

    背景 前阵子简书好像说是凉了,搞得我有点小慌,毕竟我的大部分博客都是放在简书上面的,虽然简书提供了打包导出功能,但是只能导出文字,图片的话还是存在简书服务器上面,再加上我一直想要重新做一个个人博客,于 ...

  5. python pdf 图片_第一节:python提取PDF文档中的图片

    1.安装第三方类库pymupdf:pip install pymupdf 2.安装完成后直接上代码,代码如下: import fitz import time import re import os ...

  6. java word导出图片格式_用java怎么将word文档转成图片格式

    展开全部 使用 java 操作 openoffice 实现格式转换 辛苦了几天. 不敢独享成果 首先,要安装 openoffice (废话- -) 创建JAVA项目的时候 需要323131333532 ...

  7. php手写签名保存,PHP+JS实现PC端+移动端PDF手写签名合并

    PHP+JS实现PC端+移动端PDF手写签名合并 1年前 阅读 3029 评论 0 喜欢 0 前端插件:`jSignature.js` PHP插件:`FPDF+FPDI` `index.html`代码 ...

  8. WPS文档怎样转换为图片

    文件转换操作不论是在日常生活中还是工作学习当中都会遇见.因此文件转换已经成为了基础操作,是大家都应该学习掌握的操作.为此今天小编将教给大家其中的一个转换技巧,那就是WPS转图片. 使用工具:迅捷PDF ...

  9. office文档在线预览工具平台选型

    ​​​​​​在线预览原理 文档在线预览说明: 1.业务系统生成文档浏览地址,用户通过终端进行访 2.用户终端访问文档预览资源地址,请求文档解析器,解析器分为私有云和公有云部署,作用是将文档进行解析成x ...

  10. Android 将签名布局旋转90度,Android 自定义View手写签名

    Android 自定义View:手写签名 最近项目中有个新的需求,就是要实现用户手写签名,然后展示再上传到服务器.看到效果图后,先是面对百度编程搜了一下,很多实现方法,主要就是自定义View实现的,为 ...

最新文章

  1. Paddle 环境中 使用LeNet在MNIST数据集实现图像分类
  2. 存储引擎:MySQL系列之七
  3. UIImage常用的分类
  4. 20155301实验三 免杀原理与实践
  5. mysql中,一条select语句是如何执行的?
  6. 记一起因证书引发的支付宝支付异步通知接收不到的事故
  7. 如何用append连接html文件,jquery append()怎么用?
  8. getTime()的00:00:00问题。
  9. 云服务器的规格配置该怎么选?
  10. matlab计算一组数的函数值_「数学建模」MATLAB的数值计算
  11. JavaScript实现解析xml文件数据
  12. 中国3月份采购经理人指数回升
  13. 你知道甲醛的危害有多大吗?
  14. 全国城市API(精确到县级)JSON数据
  15. html边框颜色不显示,关于html:Firefox中边框颜色显示不正确
  16. Spring Bean生命周期过程
  17. 等比数列等差数列求和
  18. 文献管理软件Mendeley最新使用指南看这里!
  19. 最大/最小费用流(板子整理)
  20. Ubuntu_在Ubuntu 12.04 中安装iTunes

热门文章

  1. ubuntu16.04中 vim8 backspace键删除功能失效
  2. NVIDIA详细解读游戏中DX9与DX11差别
  3. CHM格式 打开后不显示内容的解决办法
  4. Mathematica图片裁切
  5. 采集用python还是火车头_我才知道爬虫也可以酱紫--火车采集器
  6. RabbitMQ报错 o.s.a.r.c.CachingConnectionFactory : Channel shutdown: channel error; protocol meth
  7. 苹果手机linux系统版本号,Linux下查看系统版本号信息的方法(转)
  8. vivado error:Multiple declarations of unsigned included via multiple use clauses
  9. 木讷的程序员需要知道的事情(一)
  10. 转:[Server] 在 Windows 上安裝 PHP 5.3 開發環境