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

Windows下基于内容自动重命名科研PDF文件的技术求助

批量重命名科研PDF文件方案

核心思路

优先提取PDF的**元数据(Metadata)**获取作者、年份、标题信息;若元数据缺失,调用学术文献API通过关键词匹配补全信息,最后按规则生成合规文件名,避免硬解析不同期刊的PDF格式。

所需工具

  • Python 3.x
  • 依赖库:PyPDF2(提取PDF元数据)、crossrefapi(调用Crossref学术数据库API)、os(文件系统操作)
  • 安装命令:
pip install PyPDF2 crossrefapi

实现步骤

1. 提取PDF内置元数据

正规期刊的PDF通常会嵌入标准元数据,这是最可靠的信息来源:

import os
from PyPDF2 import PdfReader

def extract_pdf_metadata(pdf_path):
    reader = PdfReader(pdf_path)
    metadata = reader.metadata
    # 提取标题
    title = metadata.get('/Title', '').strip()
    # 提取作者,格式多为"姓氏1, 名字1, 姓氏2, 名字2..."
    authors_raw = metadata.get('/Author', '').split(', ')
    # 只保留作者姓氏
    authors = [auth.split()[-1] for auth in authors_raw if auth]
    # 提取出版年份,元数据中CreationDate格式多为"D:20230512..."
    creation_date = metadata.get('/CreationDate', '')
    year = creation_date[2:6] if len(creation_date)>=6 else ''
    return title, authors, year

2. 元数据缺失时调用API补全

如果PDF元数据不全,用原文件名或标题片段调用Crossref API获取标准文献信息:

from crossref.restful import Works

def fetch_from_crossref(query):
    works = Works()
    # 按关键词搜索,取最匹配的第一条结果
    result = works.query(query).select('title', 'author', 'issued').first()
    if not result:
        return '', [], ''
    # 处理标题
    title = result['title'][0] if result.get('title') else ''
    # 提取作者姓氏
    authors = []
    if result.get('author'):
        for auth in result['author']:
            surname = auth.get('family', '')
            if surname:
                authors.append(surname)
    # 提取出版年份
    year = str(result['issued']['date-parts'][0][0]) if result.get('issued') else ''
    return title, authors, year

3. 按规则生成合规文件名

根据作者数量生成对应格式,同时清理标题中的非法字符:

def generate_new_filename(title, authors, year):
    # 提取标题前10个词,替换系统非法字符
    title_words = title.split()[:10]
    clean_title = '_'.join(title_words).translate(str.maketrans({'/':'_', '\\':'_', ':':'_', '*':'_', '?':'_', '"':'_', '<':'_', '>':'_', '|':'_'}))
    
    # 生成作者部分
    if len(authors) >= 3:
        author_part = f"{authors[0]}_et_al"
    elif len(authors) == 2:
        author_part = f"{authors[0]}_and_{authors[1]}"
    else:
        author_part = "Unknown_Author"
    
    # 拼接最终文件名
    if year:
        new_name = f"{author_part}_{year}_{clean_title}.pdf"
    else:
        new_name = f"{author_part}_{clean_title}.pdf"
    return new_name

4. 批量处理文件夹内所有PDF

遍历目标文件夹,逐个处理并避免文件名重复:

import time

def batch_rename_pdfs(folder_path):
    for filename in os.listdir(folder_path):
        if filename.lower().endswith('.pdf'):
            pdf_path = os.path.join(folder_path, filename)
            # 先尝试提取元数据
            title, authors, year = extract_pdf_metadata(pdf_path)
            # 元数据不全时调用API补充
            if not title or not authors or not year:
                query = filename.replace('.pdf', '')
                title, authors, year = fetch_from_crossref(query)
                time.sleep(1)  # 避免API请求限流
            # 生成新文件名
            new_filename = generate_new_filename(title, authors, year)
            # 处理重名情况
            counter = 1
            temp_name = new_filename
            while os.path.exists(os.path.join(folder_path, temp_name)):
                name_base, ext = os.path.splitext(temp_name)
                temp_name = f"{name_base}_{counter}{ext}"
                counter += 1
            # 执行重命名
            os.rename(pdf_path, os.path.join(folder_path, temp_name))
            print(f"{filename} → {temp_name}")

# 替换为你的PDF文件夹路径
batch_rename_pdfs("your/pdf/folder/path")

注意事项

  • 扫描版PDF无法提取元数据,也无法通过API匹配,需手动处理
  • Crossref API有请求频率限制,批量处理时保留time.sleep(1)可避免被限流
  • 生成的文件名自动兼容Windows/macOS系统的命名规则

内容的提问来源于stack exchange,提问作者user16644158

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:47:59