

有时候,我们会有一些文件需要盖章,例如关联交易的文件、合同等,由于量比较大,一个一个盖章比较繁琐;因此,我们可以考虑用RPA来批量加入印章。
1. 把印章图片转成PDF,并把印章调整到指定大小,放到指定位置;
2. 把带印章的PDF页 与 需要盖印的PDF页进行合并;
3. 创建新的PDF文件,把需要盖印PDF文件的其它页和处理后的PDF页 加入到新的PDF文件中。
盖章前

盖章后

1. 包含所有需要盖印文件的文件夹
注:所有文件需要盖印的位置都是相同的,并且文件都是PDF类型
2. 印章图片
注:最好是PNG类型,并且是透明背景
3. 存放处理后文件的文件夹
# 使用提醒:
# 1. xbot包提供软件自动化、数据表格、Excel、日志、AI等功能
# 2. package包提供访问当前应用数据的功能,如获取元素、访问全局变量、获取资源文件等功能
# 3. 当此模块作为流程独立运行时执行main函数
# 4. 可视化流程中可以通过"调用模块"的指令使用此模块
import xbot
from xbot import print, sleep
from .import package
from .package import variables as glv
import os
from PyPDF2 import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
def main(args):
# 文件选择对话框
dialog_res = xbot.app.dialog.show_custom_dialog({
"dialog_title": "标题",
"default_btn": "确定",
"timeout":10,
"settings":{
"editors":[
{"type":"File","label":"合同所在文件夹","VariableName":"input_folder","kind":2,"filter":"所有文件|*.*","nullText":"请选择合同所在文件夹路径"},
{"type":"File","label":"印章所在路径","VariableName":"stamp_path","kind":0,"filter":"所有文件|*.*","nullText":"请选择印章所在路径"},
{"type":"File","label":"盖章后存放的文件夹","VariableName":"output_folder","kind":2,"filter":"所有文件|*.*","nullText":"请选择输入文件夹路径"},
{"type":'Number',"label":"写入横坐标(PDF左下角坐标为0,0)", "VariableName":"x"},
{"type":'Number',"label":"写入纵坐标(PDF左下角坐标为0,0)", "VariableName":"y"},
{"type":'Number',"label":"印章图片宽度(一般100-300之间)", "VariableName":"width", "value":100},
{"type":'Number',"label":"印章图片高度(一般100-300之间)", "VariableName":"height", "value":100},
{"type":'Number',"label":"需要盖印的PDF页数,例如在第1页,则填0", "VariableName":"page_num", "value":1},
]
}
})
# 输入文件夹
input_folder = dialog_res['input_folder']
# 印章路径
stamp_path = dialog_res['stamp_path']
# 输出文件夹
output_folder = dialog_res['output_folder']
# 图片在PDF第一页中的位置(左下角坐标为0,0)
x, y= dialog_res['x'], dialog_res['y']
# 图片的宽度和高度
pic_width, pic_height = dialog_res['width'], dialog_res['height']
# 盖印页数
page_num = dialog_res['page_num']
# 生成带印章的pdf
temp_path = 'temp.pdf'
stamp_reader = generate_temp_pdf(stamp_path, temp_path, x, y, pic_width, pic_height)
for file_name in os.listdir(input_folder):
# 跳过不属于pdf的文件
if os.path.splitext(file_name)[1] != '.pdf':
continue
try:
input_file_path = os.path.join(input_folder, file_name)
output_file_path = os.path.join(output_folder, file_name)
add_image_to_target_page(input_file_path, stamp_reader, output_file_path, page_num)
print(f'{file_name} 处理完成...')
except:
print(f'处理{file_name} 出现问题')
def generate_temp_pdf(stamp_path, temp_pdf_path, x, y, pic_width, pic_height):
# 创建一个包含图片的临时PDF文件
c = canvas.Canvas(temp_pdf_path, pagesize=letter)
c.drawImage(stamp_path, x, y, pic_width, pic_height, mask="auto")
c.save()
stamp_reader = PdfReader(temp_pdf_path)
return stamp_reader
def add_image_to_target_page(input_pdf_path, stamp_reader, output_pdf_path, page_num):
"""
将图片插入到PDF指定页中。
"""
# 读取原始PDF文件和临时PDF文件
reader1 = PdfReader(input_pdf_path)
writer = PdfWriter()
# 写入前面的页面
for page in reader1.pages[:page_num]:
writer.add_page(page)
# 合并盖印的页面
target_page = reader1.pages[page_num]
target_page.merge_page(stamp_reader.pages[0])
writer.add_page(target_page)
# 将剩余的页面添加到输出PDF中
for page in reader1.pages[page_num+1:]:
writer.add_page(page)
# 写入输出PDF文件
with open(output_pdf_path, "wb") as output_file:
writer.write(output_file)
1. 在Python包管理中,安装 PyPDF2、reportlab 库(可以指定这两个版本,其它版本未测试过)

2. 创建py模块文件,把代码粘贴到文件中,点击运行,或者 在主流程用【调用流程】调用即可
3. 印章大小一般在100-300之间(宽度跟高度都是相同的)
4. 写入位置的确定:
- 目前都是通过写入一次位置(例如x,y都是50)再进行预估、微调
- 也可以通过其它工具类测量,以下工具有条件的小伙伴可以测一下,看看是否真实有用
