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/
下载完压缩包之后,将压缩包解压到本地的某个地方,并记好路径。
2、需求分析
现需要将类似这种PDF文件,共10份或更多,批量插入电子签名
假设每个PDF文件的签名位置相同
写一个签名命名为tianhai.jpg
注:需将文件命名为英文,不然cv2的方法会读取不到文件
我们只需将需要签名的坐标找到,并插入图片即可。
3、代码
思路:
- 输入签字图片和PDF文件
- 将PDF文件转为图片格式
- 使用opencv对图片对签名和图片形式的文件进行处理
- 再将图片转换为PDF文件
- 输出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都可以写入