如何用Python批量替换PDF文字与Logo?现有代码未生效求排查
PDF批量文字与Logo替换解决方案
问题分析
你的代码未生效主要有以下几个原因:
- 修改后未保存PDF文件
- 图像编码处理错误(直接用
tobytes()输出原始像素,未匹配PDF图像的编码格式) - 未处理原图像的关键参数(如
BitsPerComponent) - 缺少批量处理与文字替换逻辑
修正后的完整代码
以下代码整合批量处理指定路径PDF、多组文字替换、Logo尺寸自适应替换功能,结合pikepdf处理图像,PyMuPDF处理文字替换(更高效稳定):
from pikepdf import Pdf, PdfImage, Name import os import glob from PIL import Image import zlib import fitz # PyMuPDF # 配置参数 TARGET_FOLDER = r"你的PDF文件夹路径" NEW_LOGO_PATH = r"新Logo图片路径" TEXT_REPLACE_PAIRS = [ ("原文字1", "新文字1"), ("原文字2", "新文字2"), # 可添加更多替换组 ] OUTPUT_FOLDER = os.path.join(TARGET_FOLDER, "处理后文件") # 创建输出文件夹 os.makedirs(OUTPUT_FOLDER, exist_ok=True) def replace_pdf_images(pdf): """替换PDF中所有图像为新Logo,保持原尺寸""" new_logo = Image.open(NEW_LOGO_PATH).convert("RGB") for page in pdf.pages: for img_key in page.images.keys(): pdf_img = PdfImage(page.images[img_key]) img_obj = pdf_img.obj # 获取原图像尺寸 original_width = pdf_img.width original_height = pdf_img.height # 调整Logo尺寸匹配原图像 resized_logo = new_logo.resize((original_width, original_height), Image.Resampling.LANCZOS) # 将图像转为PDF兼容的字节流 img_bytes = resized_logo.tobytes("raw", "RGB") compressed_bytes = zlib.compress(img_bytes) # 更新图像对象参数 img_obj.write(compressed_bytes, filter=Name("/FlateDecode")) img_obj.ColorSpace = Name("/DeviceRGB") img_obj.BitsPerComponent = 8 img_obj.Width = original_width img_obj.Height = original_height return pdf def replace_pdf_text(input_path, output_path): """替换PDF中的指定文字""" doc = fitz.open(input_path) for page in doc: for old_text, new_text in TEXT_REPLACE_PAIRS: text_instances = page.search_for(old_text) for inst in text_instances: # 用白色覆盖原文字区域 page.draw_rect(inst, color=(1,1,1), fill=(1,1,1)) # 在原位置插入新文字 page.insert_text( (inst.x0, inst.y0), new_text, fontsize=inst.height, color=(0,0,0) ) doc.save(output_path) doc.close() # 批量处理所有PDF文件 for pdf_path in glob.glob(os.path.join(TARGET_FOLDER, "*.pdf")): filename = os.path.basename(pdf_path) temp_path = os.path.join(OUTPUT_FOLDER, f"temp_{filename}") final_path = os.path.join(OUTPUT_FOLDER, filename) # 先处理图像替换 pdf = Pdf.open(pdf_path) pdf = replace_pdf_images(pdf) pdf.save(temp_path) pdf.close() # 再处理文字替换 replace_pdf_text(temp_path, final_path) os.remove(temp_path) # 删除临时文件 print("所有文件处理完成!")
关键修正点说明
- 图像替换:添加PDF保存逻辑,匹配原图像的像素位深、编码滤镜等参数,确保替换后尺寸和格式兼容
- 文字替换:用PyMuPDF高效搜索文字,通过覆盖原区域+插入新文字的方式保证位置准确,支持多组批量替换
- 批量处理:遍历目标文件夹所有PDF,分两步处理图像和文字,自动生成输出文件夹,不修改原文件
内容的提问来源于stack exchange,提问作者Steveit
相关产品推荐
相关产品推荐

