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

编写Python脚本移除PDF指定文本:现有代码失效求助

批量移除PDF指定文本的解决方案

问题根源

你当前的PyPDF2脚本仅提取了页面文本并完成字符串替换,但没有将修改后的内容写回PDF页面。PDF的内容并非纯文本结构,而是由包含坐标、字体、文本绘制指令的内容流组成,直接修改提取出的文本字符串无法影响原PDF的底层数据。

推荐解决方案:使用PyMuPDF(fitz)

PyMuPDF处理PDF文本编辑更直观可靠,支持精准定位并移除指定文本,适配批量操作需求:

安装依赖

pip install pymupdf

批量处理脚本

import fitz
import os

def remove_text_from_pdf(input_path, output_path, target_text):
    # 打开目标PDF
    doc = fitz.open(input_path)
    for page in doc:
        # 查找所有匹配目标文本的区域
        text_instances = page.search_for(target_text)
        # 逐个移除文本(用白色矩形覆盖实现视觉彻底移除,如需删除底层指令可进一步操作)
        for inst in text_instances:
            page.draw_rect(inst, color=(1,1,1), fill=(1,1,1))
        # 清理页面内容流,优化文件
        page.clean_contents()
    # 保存修改后的PDF
    doc.save(output_path)
    doc.close()

# 批量处理配置
input_folder = "C:/your_input_folder"
output_folder = "C:/your_output_folder"
target_text = "words to replace"

# 创建输出文件夹(不存在则自动创建)
os.makedirs(output_folder, exist_ok=True)

# 遍历处理所有PDF文件
for filename in os.listdir(input_folder):
    if filename.endswith(".pdf"):
        input_path = os.path.join(input_folder, filename)
        output_path = os.path.join(output_folder, f"modified_{filename}")
        remove_text_from_pdf(input_path, output_path, target_text)

原PyPDF2脚本的修正(局限性较大)

PyPDF2修改内容流需要解析底层绘图指令,仅适合结构简单的PDF:

import PyPDF2
from PyPDF2.generic import ContentStream, TextStringObject

def modify_pdf_content(page, target_text):
    content = page.getContents().getObject()
    if isinstance(content, ContentStream):
        new_ops = []
        for operands, operator in content.operations:
            # 处理文本绘制指令(Tj/TJ)
            if operator in (PyPDF2.utils.b_("Tj"), PyPDF2.utils.b_("TJ")):
                text = operands[0]
                if isinstance(text, TextStringObject):
                    # 替换目标文本为空
                    modified_text = text.replace(target_text, "")
                    new_ops.append(([modified_text], operator))
                else:
                    new_ops.append((operands, operator))
            else:
                new_ops.append((operands, operator))
        # 更新页面内容流
        page.getContents().setObject(ContentStream(new_ops, page.pdf))

# 单文件处理示例
with open('C:/inputput.pdf', 'rb') as pdf_file:
    pdf_reader = PyPDF2.PdfFileReader(pdf_file)
    pdf_writer = PyPDF2.PdfFileWriter()
    
    for page_num in range(pdf_reader.getNumPages()):
        page = pdf_reader.getPage(page_num)
        modify_pdf_content(page, 'words to replace')
        pdf_writer.addPage(page)
    
    with open('output_file22.pdf', 'wb') as output_file:
        pdf_writer.write(output_file)

注意事项

  • PyPDF2的方法仅能处理简单文本指令,对于嵌入字体、复杂排版或文本分块的PDF可能失效。
  • PyMuPDF的覆盖方法可实现视觉上的彻底移除,若需从内容流中完全删除文本指令,可结合page.get_text("words")定位后进一步修改内容流。

内容的提问来源于stack exchange,提问作者Ryno Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:23:04