首先需要下载所需要的库
pip install pdf2image
pip install img2pdf
pip install opencv-python
此外还需要下载poppler,这里使用的是poppler-0.67.0
这是一个处理PDF文件的工具包,里面包含了非常多的功能供我们使用。
下载地址:https://blog.alivate.com.au/poppler-windows/
下载完压缩包之后,将压缩包解压到本地的某个地方,并记好路径。
现需要将类似这种PDF文件,共10份或更多,批量插入电子签名
假设每个PDF文件的签名位置相同
写一个签名命名为tianhai.jpg
注:需将文件命名为英文,不然cv2的方法会读取不到文件
我们只需将需要签名的坐标找到,并插入图片即可。
思路:
导包
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 + item
sigJpg = 'tianhai.jpg'
outputPdf = item
signaturePdf(inputPdf,sigJpg,outputPdf)
完整代码如下:
from pdf2image import convert_from_path
import img2pdf
import cv2
import os
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)
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 + item
sigJpg = 'qianming.jpg'
outputPdf = item
signaturePdf(inputPdf,sigJpg,outputPdf)