注册

将文件夹的PDF 复制到另一个文件夹并且排序!

返回
Python 免费 编号:CODE-7CC0EE7E 下载次数:0 浏览次数:15 上传日期:2026-09-01

解决的问题

将一个文件夹的PDF,打开以后将日期提取出来。例如:2026年07月16日。提取这个日期,并且将其转为2026.07-16.重新命名!

代码内容

text
import re
import os
import shutil # 复制文件专用的 类库
import pymupdf

def extract_info(filepath,filename):
    m = re.match(r'dzfp_(\d+)_(.+?)_(\d{14})\.pdf', filename)
    if not m:
        return None,None,None

    # invoice_no == 发票  |  company == 公司名称

    invoice_no = m.group(1)
    company = m.group(2)

    # ↓↓↓ 用 PyMuPDF 打开PDF,读取第一页全部文本
    try:
        doc = pymupdf.open(filepath)
        text = doc[0].get_text()
        doc.close()
    except:
        return None,invoice_no,company

    # 提取PDF的日期  2026年7月24日
    m2 = re.search(r'(\d{4})年(\d{1,2}月(\d{1,2})日)', text)

    if m2:
        y = m2.group(1)
        mo = m2.group(2).zfill(2)
        d = m2.group(3).zfill(2)
        return f'{y}年{mo}月{d}日',invoice_no,company

    return None, invoice_no, company

def main():
    input_dir = r"C:\Users\A\Desktop\映山红\发票"
    # 重命名后存到到 ↓↓↓ 下面的文件夹路径里
    output_dir = r"C:\Users\A\Desktop\映山红\生成的文件"

    #  创建 储存成功的 列表
    results = []

    #  创建 储存失败的 列表
    failed = []

    n = 0

    # 先清空旧得输出 output_dir 文件夹里面的文件避免残留
    for old_file in os.listdir(output_dir):
        if old_file.endswith('.pdf'):
            os.remove(os.path.join(output_dir,old_file))


    # ↓↓↓ 收集所有 .pdf 文件,按文件名排序  |  一共得到 108个 文件
    pdf_files = sorted(
        f for f in os.listdir(input_dir) if f.lower().endswith('.pdf')
    )

    # print(len(pdf_files))
    # breakpoint()

    total = len(pdf_files)
    # 如果 pdf_files 列表的元素是 0 个 则退出整个程序
    if total == 0:
        print("文件夹没有文件")
        return

    #  此时将已经提取的文件名称进行逐个处理
    for i,filename in enumerate(pdf_files):  #  循环==++==
        # 路径合并!
        filepath = os.path.join(input_dir, filename)

        #  自定义函数 提取 日期  发票号  公司名
        date_str,invoice_no,company = extract_info(filepath,filename)

        if date_str:
            # 成功的装进这里面
            results.append((date_str,invoice_no,company,filename))
        else:
            #  失败的转入这里面
            failed.append(filename)


    results.sort(key=lambda x:(x[0],x[1]))


    for idx, (date_str, invoice_no, company, filename) in enumerate(results, 1):
        n = n + 1
        #  类似于 VBA 中的Format 1 变成 001
        seq = str(idx).zfill(3)

        # 日期格式 2026年07月04日 转为 2026-07-04 使用的是 替换 的方法
        date_fmt = date_str.replace('年', '-').replace('月', '-').replace('日', '')

        # 拼接新的文件名
        new_name = f'{seq}.{date_fmt}_{invoice_no}_{company}.pdf'

        # 复制文件(保留源文件不动)
        src = os.path.join(input_dir, filename)
        dst = os.path.join(output_dir, new_name)
        shutil.copy2(src, dst)





if __name__ == '__main__':
    main()