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 + 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)

结果如下:多少个PDF都可以写入
在这里插入图片描述文章来源地址https://uudwc.com/A/z35p1

原文地址:https://blog.csdn.net/tianhai12/article/details/131276628

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

h
上一篇 2023年07月25日 02:27
win10 Docker Desktop使用GPU
下一篇 2023年07月25日 02:28