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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:39:50