如何按文件名规则分组单页tif文件并拼接对应OCR识别文本
解决方案
你可以按「文件名前缀分组、同组内按页码排序」的逻辑实现文本拼接,完整实现方案如下:
核心逻辑说明
根据你给出的文件名示例,同组文件的核心特征是:去掉末尾_三位数字.tif后缀后的前缀完全一致;单页文件没有末尾的页码段,直接用主文件名作为分组键即可。
完整代码实现
import glob import re import os import pandas as pd import pytesseract from PIL import Image # 匹配末尾页码段和.tif后缀的正则 page_pattern = re.compile(r"(_\d{3})?\.tif$", re.IGNORECASE) file_info = [] listOfPages = glob.glob(r"C:/Users/name/test/*.tif") for entry in listOfPages: # 提取无路径的纯文件名 file_name = entry.split("/")[-1] # 提取分组键:去掉页码段和.tif后缀 group_key = page_pattern.sub("", file_name) # 提取页码:有_xxx后缀取对应数字,无页码的单页文件默认页码为0 page_match = re.search(r"_(\d{3})\.tif$", file_name, re.IGNORECASE) page_num = int(page_match.group(1)) if page_match else 0 # 执行OCR识别 text = pytesseract.image_to_string(Image.open(entry), lang="en") file_info.append({ "group_key": group_key, "page_num": page_num, "raw_text": text, "file_path": entry }) # 转DataFrame后先按分组、再按页码排序 df = pd.DataFrame(file_info).sort_values(by=["group_key", "page_num"]) # 1. 得到拼接后的文本数据集:同组文本按页码顺序拼接,可自定义页分隔符 merged_text_df = df.groupby("group_key")["raw_text"].apply("\n---\n页分隔符\n---\n".join).reset_index() merged_text_df.columns = ["merge_file_name", "full_text"] # 2. 可选:生成带原始图像的可检索PDF(比纯文本转PDF效果更好,符合你的原始需求) pdf_folder = r"C:/Users/name/test/pdf_folder" os.makedirs(pdf_folder, exist_ok=True) for group_key, group_data in df.groupby("group_key"): # 按页码排序取所有同组文件 sorted_files = group_data.sort_values("page_num")["file_path"].tolist() # 拼接所有页的PDF二进制内容(自带OCR文本层) full_pdf = b"" for f in sorted_files: full_pdf += pytesseract.image_to_pdf_or_hocr(Image.open(f), lang="en", extension="pdf") # 保存合并后的PDF with open(os.path.join(pdf_folder, f"{group_key}.pdf"), "wb") as f: f.write(full_pdf)
结果说明
merged_text_df中每行对应一个合并后的文件,merge_file_name就是你需要的目标文件名,full_text是同组所有页按顺序拼接后的完整文本- 可选的PDF生成逻辑直接在原始图像上叠加OCR文本层,既保留了原始文件内容,又支持全文检索,完全符合需求。
内容的提问来源于stack exchange,提问作者id345678
相关产品推荐
相关产品推荐

