在建筑行业,设计师用CAD设计完建筑图纸后,常常需要上传到市、省二级图审平台上,故需要将每张图纸转成PDF文档,并盖电子章(出图章、建造师章和结构章),然后上传图审系统。如果设计师在CAD转PDF时没标明图幅大小(A0,A1,A3,A4?),盖章的人就不得不一张张地打开来查看并盖章,没办法用“批量盖章”的方式。由于图纸量大,往往累成狗。

电子章要批量盖章的前提条件就是:同一批图纸的图幅是相同的,这样,电子章盖在相同的地方才不会错位。

为了解决这个问题,我用Python编了一个脚本,它可以自动识别PDF文档的尺寸(size),也就是“图幅”,并将相同图幅的PDF文档归纳到同一个目录中,以方便批量盖电子章。

该代码经多次实践,方便可靠。

以下是源代码:

'''第一步:
批量获取PDF文档的第一页的页面大小,并将其添加到该PDF文档文件名的最后面
'''
#打开PDF图纸所在的文件夹,将其文件路径复制到剪贴板中
#先指定要处理的图纸目录,注意:反斜杠“\“要改为斜杠"/"

#------------------将复制在剪贴板中的文件路径中的“\”替换成"/",并重新复制到剪贴板中------------------
import pyperclip

# 获取剪贴板中的文本
file_path = pyperclip.paste()

# 将 "\\" 替换为 "/"
file_path = file_path.replace("\\", "/")

# 将修改后的文本复制到剪贴板
pyperclip.copy(file_path)

#将修改后的文件夹路径赋予变量
目录 = pyperclip.paste()
#------------------

import os
import fitz  # PyMuPDF库

def get_pdf_page_sizes(pdf_path):
    page_sizes = {}
    try:
        doc = fitz.open(pdf_path)
        for page_num in range(doc.page_count):
            page = doc[page_num]
            width = page.rect.width  # 获取页面宽度
            height = page.rect.height  # 获取页面高度
            size = (width, height)
            page_sizes.setdefault(size, []).append(page_num + 1)  # 将页面大小和页码添加到字典中
    except Exception as e:
        print(f"Error processing {pdf_path}: {e}")
    finally:
        if doc:
            doc.close()
    return page_sizes

def rename_files_with_page_size(pdf_folder):
    # 遍历文件夹中的所有PDF文件
    for filename in os.listdir(pdf_folder):
        if filename.endswith(".pdf"):
            pdf_path = os.path.join(pdf_folder, filename)
            print(f"Processing {pdf_path}...")
            page_sizes = get_pdf_page_sizes(pdf_path)
            for size, pages in page_sizes.items():
                if len(pages) > 0:  # 如果有页面大小信息
                    # 构建新的文件名
                    new_filename = f"{os.path.splitext(filename)[0]}_Page_{pages[0]}_Size_{size[0]}x{size[1]}.pdf"
                    new_path = os.path.join(pdf_folder, new_filename)
                    # 重命名文件
                    try:
                        os.rename(pdf_path, new_path)
                        print(f"Renamed {filename} to {new_filename}")
                    except Exception as e:
                        print(f"Error renaming {filename} to {new_filename}: {e}")

# 指定包含PDF文件的文件夹路径
pdf_folder_path = 目录

# 将“Page 1 Size:”后面的内容添加到原文件名的最后面(重命名文件)
rename_files_with_page_size(pdf_folder_path)

#------------------------------------------------------------------------------------------------
'''第二步:
将文件名后面从“Page_1_Size_"开始到后缀名之前的内容相同的文件(就是页面大小相同的文件)归类到同一目录
'''
import os
import shutil

def move_files_with_common_part(directory):
    # 获取目录中的所有文件
    files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]

    # 创建字典来存储共同部分和目标目录的对应关系
    common_parts = {}

    for file_name in files:
        # 查找文件名中的共同部分
        start_index = file_name.find("Page_1_Size_") + len("Page_1_Size_")
        end_index = file_name.find(".", start_index)
        common_part = file_name[start_index:end_index]

        # 构建目标目录路径
        target_directory = os.path.join(directory, common_part)

        # 创建目录(如果不存在)
        if not os.path.exists(target_directory):
            os.makedirs(target_directory)

        # 构建原文件路径和目标文件路径
        source_path = os.path.join(directory, file_name)
        target_path = os.path.join(target_directory, file_name)

        # 移动文件到目标目录
        shutil.move(source_path, target_path)
        print(f"移动文件: {file_name} -> {target_path}")

        # 更新字典中的目标目录路径
        common_parts[common_part] = target_directory

    # 输出每个共同部分的目标目录路径
    for common_part, target_directory in common_parts.items():
        print(f"共同部分: {common_part},目标目录: {target_directory}")

if __name__ == "__main__":
    # 指定目录路径
    target_directory = 目录

    # 调用函数移动具有相同共同部分的文件
    move_files_with_common_part(target_directory)
04-25 09:59