Discuz! Board

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

python向pdf添加文字和图片

[复制链接]

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
发表于 2024-1-13 08:39:29 | 显示全部楼层 |阅读模式
  1. import fitz  # PyMuPDF
  2. import PyPDF2  
  3. from PIL import Image

  4. class pdfEditor():
  5.     def __init__(self,pdf_path):
  6.         self.pdf_document = fitz.open(pdf_path)
  7.         
  8.     def find_text_positions(self, search_text):
  9.         positions = []

  10.         # 遍历每一页
  11.         for page_num in range(self.pdf_document.page_count):
  12.             page = self.pdf_document.load_page(page_num)
  13.             # 获取页面的文本块和位置信息
  14.             text_blocks = page.get_text_blocks()
  15.             
  16.             # 解析文本块并查找特定文本的位置
  17.             for block in text_blocks:
  18.                 word = block[4]
  19.                 if search_text in word:
  20.                     # 获取单词在页面上的位置(矩形框)
  21.                     rect = block[0:4]
  22.                     # 将位置信息添加到列表中
  23.                     positions.append((page_num, rect))
  24.         return positions

  25.     def insert_pic_in_pdf(self,image_path,positions = [(0,(0,0,0,0))],relative_pos = [-20,-20]):
  26.         
  27.         for position in positions:
  28.             # 选择要插入图片的页面(例如第一页)
  29.             page_number = position[0]
  30.             page = self.pdf_document[page_number]


  31.             # 定义图片插入的位置和大小
  32.             
  33.             rect = fitz.Rect(int(position[1][2])+relative_pos[0],int(position[1][1])+relative_pos[1], int(position[1][2])+200+relative_pos[0], int(position[1][1])+200+relative_pos[1])  # (x0, y0, x1, y1)

  34.             # 插入图片
  35.             page.insert_image(rect, filename=image_path)

  36.         
  37.     #插入文字,文字和位置一一对应,如果文字只有一个,就各处相同
  38.     def add_text_at_positions(self,texts=['text'],font_size = 24,skip = 0,positions = [(0,(0,0,0,0))],relative_pos = [-20,-20]):
  39.          # 打开现有的PDF文件
  40.         while positions[0][0]<skip:
  41.             positions = positions[1:];
  42.         if len(texts) == 1:
  43.             texts = [texts[0]] * len(positions)
  44.             
  45.         for text,position in zip(texts,positions):
  46.             page = self.pdf_document.load_page(position[0])
  47.             # 定义文本、字体、大小和位置
  48.             font_path = "C:/Windows/Fonts/simsun.ttc"  # 替换为你的字体文件路径
  49.             font_name = "SimSun"  # 使用内置的Helvetica字体
  50.             font_size = 24
  51.             rect = [int(position[1][2])+relative_pos[0],int(position[1][1])+relative_pos[1]]  # 文本矩形框的左下角坐标(x, y),单位:点(1点 = 1/72英寸)


  52.             # 加载字体
  53.             page.insert_font(fontname=font_name, fontfile=font_path)
  54.             page.insert_text(rect, text, fontsize=font_size, fontname=font_name, color=(1, 0, 0))  # 重新插入文本框

  55.             # 保存修改后的PDF文件
  56.         
  57.     def save_pdf(self,name_pdf_output):
  58.         self.pdf_document.save(name_pdf_output,incremental=False);

  59.     def add_text_in_pdf_where_text(self,texts=['2025'],font_size = 24,pdf_path = "ah.pdf",search_text = "年",skip = 0, relative_pos = [-20,-20]):
  60.         positions = self.find_text_positions(search_text);
  61.         self.add_text_at_positions(texts,font_size ,skip,positions ,relative_pos);
  62.         

  63.     def add_pic_in_pdf_where_text(self,stamp = 'sign(1).png',pdf_path = "ah.pdf",search_text = "指导教师签名",relative_pos = [-20,-100]):
  64.         positions = self.find_text_positions(search_text)
  65.         #self.add_stamp(pdf_path, stamp,positions,name_pdf_output)
  66.         self.insert_pic_in_pdf(stamp,positions,relative_pos)
  67.         

  68. if __name__ == '__main__':
  69.     pe = pdfEditor( "ah.pdf");
  70.     #pe.add_stamp_in_pdf_where_text(stamp = 'sign(1).png',pdf_path = "ah.pdf",search_text = "指导教师签名",name_pdf_output='output1.pdf');
  71.     #pe.add_text(pdf_path,texts=['text'],positions = [(0,(0,0,0,0))],relative_pos = [-20,-20],name_pdf_output='o.pdf'):
  72.     pe.add_text_in_pdf_where_text();
  73.     pe.add_pic_in_pdf_where_text();
  74.     pe.save_pdf('output667.pdf')
复制代码

回复

使用道具 举报

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
 楼主| 发表于 2024-1-19 16:47:00 | 显示全部楼层
  1. from openpyxl import load_workbook
  2. from pdfEditor import pdfEditor



  3. # 加载 Excel 文件
  4. file_path = "00名单_22光信本1 -实验成绩.xlsx"  # Excel 文件路径
  5. wb = load_workbook(file_path)  # 加载工作簿
  6. ws = wb['实验成绩']  # 获取当前活动的工作表

  7. flag_1st = True
  8. pe = pdfEditor();

  9. root = r"D:\\0.山东航空学院\\课程:数字图像处理\\2023-2024-2 22光信\";
  10. root_temp = root+r'datatemp\\'
  11. for row in ws.iter_rows(values_only=True):  # 逐行读取数据
  12.     print(row)
  13.     if flag_1st:
  14.         flag_1st = False;
  15.         continue
  16.     a_pdfname = root_temp +str(row[0])+"2023-2024-2《数字图像处理》上机考核材料(22光信本1) .pdf"
  17.     b_pdfname = root_temp +str(row[0]+1)+"2023-2024-2《数字图像处理》上机考核材料(22光信本1) .pdf"
  18.     pe.add_text_in_pdf_where_text(texts=['错误数'+str(row[4])+'操作分'+str(row[7])+'用时'+str(row[5])+'分钟,熟练分:'+str(row[6])+'总分'+str(row[8])],\
  19.                                   font_size = 18,pdf_path =a_pdfname ,\
  20.                                   search_text = row[1],skip =2,relative_pos = [-480,-60],\
  21.                                   name_pdf_output= b_pdfname );
复制代码

回复

使用道具 举报

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
 楼主| 发表于 2025-3-14 15:57:30 | 显示全部楼层
import fitz  # PyMuPDF

def find_text_positions(pdf_path, search_text):
    # 打开PDF文件
    doc = fitz.open(pdf_path)
    positions = []

    # 遍历每一页
    for page_num in range(doc.page_count):
        page = doc.load_page(page_num)
        # 获取页面的文本块和位置信息
        text_blocks = page.get_text_blocks()
        
        # 解析文本块并查找特定文本的位置
        for block in text_blocks:
            word = block[4]
            if search_text in word:
                # 获取单词在页面上的位置(矩形框)
                rect = block[0:4]
                # 将位置信息添加到列表中
                positions.append((page_num, rect))

    return positions

# 示例使用
pdf_path = "ah.pdf"
search_text = "指导教师签名"
positions = find_text_positions(pdf_path, search_text)
print(positions)
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-6-8 07:34 , Processed in 0.035579 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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