AlexRomeo
发布于 2024-12-17 / 108 阅读
0
0

python修改pdf文件内容

背景

某公司给出的模板文件是旧的,抬头信息中的年份不对,原文件(word)已被清理,pdf文件数量巨大,人工手动编辑的工作成本较高,且时间久。通过python代码实现pdf文件的内容编辑。

需要注意,临时编写的代码内容,未经过优化,使用时,请自行调整。

单文件处理

代码如下:

import fitz  # PyMuPDF
import os

# 输入和输出文件路径
input_file = r"F:\Users\alex\Desktop\Temp\SourcePDF.pdf"
output_file = r"F:\Users\alex\Desktop\Temp\FinalPDF.pdf"

# 需要替换的内容
target_text = "2023-2024 ******期"
replacement_text = "2024-2025 ******期"

# 字体路径,确保是 TTF 文件,如文字格式没有需求可以不使用此行代码。
font_path = "C:/Windows/Fonts/simhei.ttf"

def replace_text_in_pdf(input_path, output_path, target, replacement, font_path):
    # 检查字体文件路径是否存在
    if not os.path.exists(font_path):
        raise FileNotFoundError(f"字体文件不存在: {font_path}")

    doc = fitz.open(input_path)  # 打开 PDF 文档

    # 遍历每一页进行文本替换
    for page in doc:
        areas = page.search_for(target)  # 查找目标文本位置

        # 注册字体,并指定名称
        fontname = "simhei"
        page.insert_font(fontname=fontname, fontfile=font_path)

        for area in areas:  # 遍历找到的所有目标文本区域
            # 删除原文本:用白色矩形覆盖原区域
            page.draw_rect(area, color=(1, 1, 1), fill=(1, 1, 1))

            # 插入新文本到覆盖后的区域
            page.insert_text(
                point=(area.x0, area.y0),  # 文本插入位置
                text=replacement,         # 要插入的新文本
                fontsize=18,              # 字体大小
                fontname=fontname,        # 字体名称(必须是 insert_font 注册的名称)
                color=(0, 0, 0)           # 字体颜色 (黑色)
            )

    # 保存修改后的 PDF 文件
    doc.save(output_path)
    print(f"替换完成!新文件保存为:{output_path}")

# 调用替换函数
replace_text_in_pdf(input_file, output_file, target_text, replacement_text, font_path)

目录中多文件批处理

代码如下:

import fitz  # PyMuPDF
import os

# 输入目标路径及被处理的文件夹
source_path = r"F:\Users\alex\Desktop\Temp\temp\"
source_folder = "特殊图形资料"

# 拼接输入和输出文件夹路径
input_folder = f"{source_path}\\{source_folder}"
output_folder = f"{source_path}\\{source_folder}_result"

# 确保输出文件夹存在
os.makedirs(output_folder, exist_ok=True)

# 需要替换的内容
target_text = "2023-2024 ******期"
replacement_text = "2024-2025 ******期"

# 字体路径,确保是 TTF 文件
font_path = "C:/Windows/Fonts/simhei.ttf"


def replace_text_in_pdf(input_path, output_path, target, replacement, font_path):
    # 检查字体文件路径是否存在
    if not os.path.exists(font_path):
        raise FileNotFoundError(f"字体文件不存在: {font_path}")

    doc = fitz.open(input_path)  # 打开 PDF 文档

    # 遍历每一页进行文本替换
    for page in doc:
        areas = page.search_for(target)  # 查找目标文本位置W

        # 注册字体,并指定名称
        fontname = "simhei"
        page.insert_font(fontname=fontname, fontfile=font_path)

        for area in areas:  # 遍历找到的所有目标文本区域
            # 删除原文本:用白色矩形覆盖原区域
            page.draw_rect(area, color=(1, 1, 1), fill=(1, 1, 1))

            # 插入新文本到覆盖后的区域
            page.insert_text(
                point=(area.x0, area.y0),  # 文本插入位置
                text=replacement,  # 要插入的新文本
                fontsize=18,  # 字体大小
                fontname=fontname,  # 字体名称(必须是 insert_font 注册的名称)
                color=(0, 0, 0)  # 字体颜色 (黑色)
            )

    # 保存修改后的 PDF 文件
    doc.save(output_path)
    print(f"替换完成!新文件保存为:{output_path}")


# 遍历输入文件夹中的所有 PDF 文件
for filename in os.listdir(input_folder):
    if filename.endswith(".pdf"):
        input_file = os.path.join(input_folder, filename)
        output_file = os.path.join(output_folder, filename)
        replace_text_in_pdf(input_file, output_file, target_text, replacement_text, font_path)

欢迎留言讨论。


评论