如何用Python替换PDF中含指定文本的行?字体匹配问题求助
解决PyMuPDF替换PDF文本时字体不匹配的问题
你的问题出在使用add_redact_annot时未指定原文本的字体参数,默认调用了PyMuPDF的内置字体,导致替换后的字体和原文本不一致。要解决这个问题,需要先获取目标文本所在位置的字体信息,再在添加红注时指定匹配的字体参数。
修改后的代码
import os import fitz search_text = "SIK" replace_text = "Test" for file_name in os.listdir(): if file_name.startswith("ATTBill") and file_name.endswith(".pdf"): pdf_file = fitz.open(file_name) found = False for page in pdf_file: # 获取页面文本的结构化数据,包含字体、位置、颜色等详细信息 text_dict = page.get_text("dict") target_font = None target_fontsize = None target_text_color = None # 遍历文本块,定位包含目标文本的片段并提取字体属性 for block in text_dict["blocks"]: if "lines" in block: for line in block["lines"]: for span in line["spans"]: if search_text in span["text"]: target_font = span["font"] target_fontsize = span["size"] target_text_color = span["color"] found = True break if target_font: break if target_font: break if target_font: # 搜索目标文本的位置矩形 draft = page.search_for(search_text.strip()) for rect in draft: # 添加红注时传入匹配的字体参数 annot = page.add_redact_annot( rect, text=replace_text, fontname=target_font, fontsize=target_fontsize, text_color=target_text_color ) page.apply_redactions() page.apply_redactions(images=fitz.PDF_REDACT_IMAGE_NONE) if found: output_file_name = file_name.replace('0604', '') pdf_file.save(output_file_name, garbage=4, deflate=True) print(found) pdf_file.close()
关键说明
page.get_text("dict")会返回页面文本的结构化数据,其中每个span对象包含对应文本片段的字体名称、字号、颜色等属性- 找到包含目标文本的
span后,记录其字体参数,在add_redact_annot时传入这些参数,确保替换文本与原文本字体样式一致 - 如果PDF中同一目标文本存在多种字体样式,当前代码会匹配第一个找到的样式,若需处理多场景可扩展逻辑遍历所有匹配的文本块
内容的提问来源于stack exchange,提问作者Sik Saw
相关产品推荐
相关产品推荐

