Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1436|回复: 0

python 批阅 考核 打分

[复制链接]

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
发表于 2024-1-20 16:20:47 | 显示全部楼层 |阅读模式
  1. import PyPDF2  
  2. from PyPDF2 import PdfWriter, PdfReader  
  3. from PIL import Image, ImageDraw, ImageFont
  4. import fitz  # PyMuPDF  
  5. import pandas as pd


  6. COL_NAME = 3
  7. COL_VALUE = 5


  8. def add_stamp(content_page,x1,y1,text, image_path=''):      
  9.     image = Image.open(image_path)  
  10.     pdf = Image.new('RGBA',(595,841),color=(255,255,255,255))
  11.    
  12.     draw = ImageDraw.Draw(pdf)
  13.     font = ImageFont.truetype('simsun.ttc', 10)      
  14.     draw.text((100,y1-30), text, font=font, fill=(255, 0, 0))  
  15.     if len(image_path)>0:        
  16.         pdf.paste(image, (x1,y1))  
  17.     pdf.save('temp.pdf', 'PDF')   
  18.     image_input = PdfReader('temp.pdf')  
  19.     image_page = image_input.pages[0]
  20.     image_page.merge_page(content_page)
  21.     return image_page




  22. #add_stamp('ah.pdf', 'sign.png')


  23. def foundTextInPDF(doc,page_number_start,texts,texts_pre =[],mode='first'):
  24.     #print(texts)
  25.    # print(texts_pre)
  26.     page_number = page_number_start
  27.     flag_running = True
  28.     flag_pre = False
  29.     while page_number<len(doc) and flag_running:
  30.         page = doc[page_number]

  31.         #前提页已经找到
  32.         flag_pre_found_all = True
  33.         if len(texts_pre)>0:
  34.             for text in texts_pre:
  35.                
  36.                 instances = page.search_for(text)
  37.                 if len(instances) == 0:
  38.                     flag_pre_found_all = False
  39.         else:
  40.             flag_pre = True  #如果没有前提条件直接判定满足
  41.         if flag_pre_found_all:
  42.             flag_pre = True
  43.             print(texts_pre)
  44.             print('上述前提页已经在'+str(page_number)+'页找到')
  45.             
  46.         

  47.         if flag_pre:
  48.             #搜索当前页是否为目标页
  49.             flag_found_all = True
  50.             for text in texts:
  51.                 instances = page.search_for(text)
  52.                 if len(instances) == 0:
  53.                     flag_found_all = False

  54.             if  flag_found_all:
  55.                 #记录目标物位置

  56.                 page_number_target = page_number
  57.                 text_instances = page.search_for(texts[-1])  # 你可以替换为你要搜索的文本  
  58.                 for inst in text_instances:  
  59.                     x1, y1, x2, y2 = inst#.rect
  60.                     x1 = int(x1)
  61.                     y1 = int(y1)
  62.                     x2 = int(x2)
  63.                     y2 = int(y2)
  64.                     if mode =='first':
  65.                         flag_running = False
  66.         page_number = page_number+1
  67.         
  68.     if 'page_number_target' not in locals():#没有找到目标赋值-1
  69.         page_number_target = -1
  70.         x2 = 10000
  71.         y2 = 10000   
  72.     return page_number_target,x2,y2
  73. #1打开excel
  74. #定位到第一个姓名
  75. def get_record(pdf_path = '' , excel_name ='aaa.xlsx', sheet_name='Sheet1',
  76.                 COL_NAME=3 ,ROW_NAME_RANGE = range(1,33),COL_VALUES=3,text_pre_later = '' ):
  77.     df = pd.read_excel(excel_name, sheet_name)
  78.     print(df)
  79.     doc = fitz.open(pdf_path)
  80.     record = {}
  81.     page_number_target = 0;
  82.     for row in ROW_NAME_RANGE:
  83.         #print(row)
  84.         name = df.iloc[row,COL_NAME]  
  85.         #2遍历PDF页码,尝试找定位姓名
  86.         #print(name)
  87.         page_number_target,x,y = foundTextInPDF(doc,page_number_target,
  88.                                                 ['评分'],
  89.                                                 [name,text_pre_later])

  90.         if x != 10000:
  91.             values = '';
  92.             for col in COL_VALUES:
  93.                 values+= str(df.iloc[0, col])+':'+str(df.iloc[row, col])+';'
  94.             record[page_number_target] = {'x':x,'y':y, 'value':values}
  95.             print(name+' 已经批阅')
  96.         else:
  97.             print(name+' not found')
  98.     doc.close()
  99.     return record
  100.    
  101. pdf_path = '1.pdf'
  102. pdf_path_out = '期末考核记录单_电子电路CAD_22电信本4_评阅版.pdf'
  103. COL_VALUES_SET=[[3,4,5,6,8,12,15]]
  104. texts_pre_set = ['记录单']
  105. for i in range(1):#看多少轮,实验报告等材料需要设定
  106.     print(texts_pre_set[i])
  107.     record = get_record(pdf_path = pdf_path,
  108.                         excel_name ='【成绩总表】电子电路CAD_22电信_成绩.xlsx',
  109.                         sheet_name='期末考核_22电信本4',
  110.                         COL_NAME = 2 ,
  111.                         ROW_NAME_RANGE = range(2,29),
  112.                         COL_VALUES = COL_VALUES_SET[i],
  113.                         text_pre_later = texts_pre_set[i]
  114.                         )
  115.     print(record)
  116.     pdf_input = PdfReader(pdf_path)
  117.     pdf_output = PdfWriter()
  118.     for page_number in range(len(pdf_input.pages)):
  119.         content_page = pdf_input.pages[page_number]
  120.         if page_number in record:
  121.             print(page_number)
  122.             content_page = add_stamp(content_page,
  123.                                      record[page_number]['x'],
  124.                                      record[page_number]['y']+40,
  125.                                      record[page_number]['value'], 'sign1.png')
  126.         pdf_output.add_page(content_page)

  127.     with open(pdf_path_out, 'wb') as output_file:  
  128.           pdf_output.write(output_file)

复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-4-5 03:45 , Processed in 0.036075 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表