python自动化办公——定制化将电子签名批量签写到PDF文件

python自动化办公——定制化将电子签名批量签写到PDF文件

文章目录

  • python自动化办公——定制化将电子签名批量签写到PDF文件
    • 1、安装依赖
    • 2、需求分析
    • 3、代码

1、安装依赖

首先需要下载所需要的库

pip install pdf2image
pip install img2pdf
pip install opencv-python

此外还需要下载poppler,这里使用的是poppler-0.67.0

这是一个处理PDF文件的工具包,里面包含了非常多的功能供我们使用。

下载地址:https://blog.alivate.com.au/poppler-windows/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mZhYkSEa-1687095937537)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230618210931647.png)]

下载完压缩包之后,将压缩包解压到本地的某个地方,并记好路径。

2、需求分析

现需要将类似这种PDF文件,共10份或更多,批量插入电子签名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CZNggct3-1687095937538)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230618211812141.png)]

假设每个PDF文件的签名位置相同

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fDPGbUHB-1687095937539)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230618212007712.png)]

写一个签名命名为tianhai.jpg

注:需将文件命名为英文,不然cv2的方法会读取不到文件

我们只需将需要签名的坐标找到,并插入图片即可。

3、代码

思路:

  1. 输入签字图片和PDF文件
  2. 将PDF文件转为图片格式
  3. 使用opencv对图片对签名和图片形式的文件进行处理
  4. 再将图片转换为PDF文件
  5. 输出PDF

导包

from pdf2image import convert_from_path
import img2pdf
import cv2
import os

使用pdf2image的convert_from_path方法,用于读取输入的PDF文件并将其转换为图片,注意将poppler-0.67.0\bin写入到参数里。

def pdf_to_image(inputPdf,outputJpg):images = convert_from_path(pdf_path=inputPdf,dpi=400,thread_count=4,poppler_path='D:\\文件项目\\autoSign\\poppler-0.67.0\\bin')for index, img in enumerate(images):if index % 10 == 0:print('正在转换第%s页...' % (index))img.save(outputJpg + '_%s.jpg' % (index))

定义处理签名图片的函数

def signatureJpg(inputJpg,sigJpg,outputJpg):oriData = cv2.imread(inputJpg,0)sigData = cv2.imread(sigJpg,0)print(oriData.shape)oriRow = int(oriData.shape[0]*11.5//17)oriCol = int(oriData.shape[1]*5//12)print(oriCol,oriRow)# cv2.imshow('this',oriData)for i in range(sigData.shape[0]):for j in range(sigData.shape[1]):if sigData[i][j] < 100:oriData[oriRow+i][oriCol+j] = sigData[i][j]cv2.imwrite(outputJpg,oriData)

定义将图片形式转换为PDF的函数

def jpg_to_pdf(inputfile,outputfile):with open('output/' + outputfile,'wb') as f:f.write(img2pdf.convert(inputfile))print('ok')

定义签名的函数,传入原始PDF、电子签名,输出pdf

def signaturePdf(inputPdf,sigJpg,outputPdf):outputJpg = 'pdf2img'pdf_to_image(inputPdf,outputJpg)signatureJpg(outputJpg + '_0.jpg', sigJpg, outputJpg + '.jpg')jpg_to_pdf(outputJpg + '.jpg',outputPdf)

最后循环传入所有PDF进行处理,并执行上述函数,输出结果。

for i, j, k in os.walk('input/'):print(i,j,k)for item in k:inputPdf = i + itemsigJpg = 'tianhai.jpg'outputPdf = itemsignaturePdf(inputPdf,sigJpg,outputPdf)

完整代码如下:

from pdf2image import convert_from_path
import img2pdf
import cv2
import osdef pdf_to_image(inputPdf,outputJpg):images = convert_from_path(pdf_path=inputPdf,dpi=400,thread_count=4,poppler_path='D:\\文件项目\\autoSign\\poppler-0.67.0\\bin')for index, img in enumerate(images):if index % 10 == 0:print('正在转换第%s页...' % (index))img.save(outputJpg + '_%s.jpg' % (index))def signatureJpg(inputJpg,sigJpg,outputJpg):oriData = cv2.imread(inputJpg,0)sigData = cv2.imread(sigJpg,0)print(oriData.shape)oriRow = int(oriData.shape[0]*11.5//17)oriCol = int(oriData.shape[1]*5//12)print(oriCol,oriRow)# cv2.imshow('this',oriData)for i in range(sigData.shape[0]):for j in range(sigData.shape[1]):if sigData[i][j] < 100:oriData[oriRow+i][oriCol+j] = sigData[i][j]cv2.imwrite(outputJpg,oriData)def jpg_to_pdf(inputfile,outputfile):with open('output/' + outputfile,'wb') as f:f.write(img2pdf.convert(inputfile))print('ok')def signaturePdf(inputPdf,sigJpg,outputPdf):outputJpg = 'pdf2img'pdf_to_image(inputPdf,outputJpg)signatureJpg(outputJpg + '_0.jpg', sigJpg, outputJpg + '.jpg')jpg_to_pdf(outputJpg + '.jpg',outputPdf)for i, j, k in os.walk('input/'):print(i,j,k)for item in k:inputPdf = i + itemsigJpg = 'qianming.jpg'outputPdf = itemsignaturePdf(inputPdf,sigJpg,outputPdf)

结果如下:多少个PDF都可以写入
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统中的信号

信号是由用户、系统或者进程发送给目标进程的信息&#xff0c;以通知目标进程某个状态的改变或系统异常。Linux信号可由如下条件产生&#xff1a; 对于前台进程&#xff0c;用户可以通过输入特殊的终端字符来给它发送信号。比如输入CtrlC通常会给进程发送一个中断信号&#xf…

charles unknown 问题和手机代理设置(iOS手机)

一、Charles下载 下载地址&#xff1a;https://www.charlesproxy.com/download/ 二、Charles配置代理 1.查看本机IP&#xff1a;help-->Local IP Address 2.查看或者设置访问端口&#xff1a;Proxy->Proxy Settings 3.设置不代理计算机的请求&#xff08;推荐&#xff0…

【NLP】Attention机制和RNN

一、说明 循环神经网络是深度学习的主要内容之一,它允许神经网络处理文本、音频和视频等数据序列。它们可用于将序列简化为高级理解、注释序列,甚至从头开始生成新序列! 二、引进长记忆网络 基本的 RNN 设计很难处理较长的序列,但一种特殊的变体——“长短期记忆”网络 [1]…

蓝桥杯专题-试题版-【操作格子】【查找整数】【分解质因数】【高精度加法】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

爬虫入门指南(5): 分布式爬虫与并发控制 【提高爬取效率与请求合理性控制的实现方法】

文章目录 前言多线程与多进程多线程多进程多线程和多进程的选择 使用Scrapy框架实现分布式爬虫1. 创建Scrapy项目2. 配置Scrapy-Redis3. 创建爬虫4. 启动爬虫节点5. 添加任务到队列 并发控制与限制请求频率并发控制限制请求频率 未完待续... 前言 在进行爬虫任务时&#xff0c;…

地下水管三维可视化综合管控平台提升政府服务质量

随着当前互联网技术数据的快速发展和增长&#xff0c;总数越来越大&#xff0c;结构越来越复杂。如果你想更清楚、更快地理解和理解数据&#xff0c;传统的二维平面图数据图性能不能满足需求。 什么是三维可视化? 三维可视化是一种利用计算机技术&#xff0c;再现三维世界中的…

Spring Boot中的@EnableWebSocketMessageBroker注解是什么,原理,以及如何使用

Spring Boot中的EnableWebSocketMessageBroker注解是什么&#xff0c;原理&#xff0c;以及如何使用 WebSocket是一种在Web浏览器和Web服务器之间进行双向通信的技术。在传统的HTTP通信中&#xff0c;客户端向服务器发送请求&#xff0c;服务器响应请求&#xff0c;然后关闭连…

Redis 主从复制 哨兵 集群

Redis 主从复制 哨兵 集群 一、Redis 主从复制1.1 Redis 主从复制介绍1.2 主从复制的作用1.3 主从复制的流程 二、搭建Redis 主从复制2.1 安装 Redis2.2 创建redis工作目录2.3 环境变量2.4 定义systemd服务管理脚本2.5 修改 Redis 配置文件&#xff08;Master节点操作&#xff…

ModaHub魔搭社区:向量数据库MIlvus服务端配置(三)

目录 gpu 区域 logs 区域 metric_config 区域 gpu 区域 在该区域选择是否在 Milvus 里启用 GPU 用于搜索和索引创建。同时使用 CPU 和 GPU 可以达到资源的最优利用&#xff0c;在特别大的数据集里做搜索时性能更佳。 若要切换到 CPU-only 模式&#xff0c;只要将 enable 设…

设计模式学习之代理模式

设计模式系列往期文章 设计模式学习之策略模式设计模式学习之策略模式在前端的应用设计模式学习之简单工厂模式设计模式学习之工厂方法模式设计模式学习之抽象工厂模式设计模式学习之策略模式和简单工厂模式的对比设计模式学习之观察者模式设计模式学习之模板方法模式 代理模…

Nginx-反向代理详解

本文已收录于专栏 《中间件合集》 目录 概念说明什么是Nginx什么是反向代理 功能介绍配置过程1.修改nginx配置文件修改全局模块修改工作模块修改HTTP模块 2.保存配置文件3.重启配置文件4.查看配置文件是否重启成功 配置反向代理的好处总结提升 概念说明 什么是Nginx Nginx 是一…

《企业性能测试:体系构建、落地指导与案例解读》——小解送书第四期

目录 介绍 抽奖 介绍 软件系统性能的重要性无须多言&#xff0c;没有哪个用户可以忍受一个响应缓慢的网站或者反应迟钝的软件。软件性能是用户体验的核心。大部分用户可能对软件性能并不了解&#xff0c;但他们永远想使用响应更迅速的软件。所以&#xff0c;性能是评估一个软…