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
相关产品推荐
相关产品推荐

