编写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
相关产品推荐
相关产品推荐

