You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:43:27