Python中可以处理PDF的库有许多,PyMuPDF便是其中之一,该库的运行速度比较快,功能还是蛮强大的,可以试着用一下。
一般而言,可以采用读取PDF文件的metadata来获取论文的标题,但是有些PDF文件的metadata可能缺失,此时就比较棘手了。但是也可以通过读取PDF中文本内容,通过文本内容的字号大小来判断那些文本内容是论文的标题。
假设:一般情况下,标题字号比较大,同时位于第一页。
根据上述假设,我利用python中的PyMuPDF库,并根据论文标题来批量更改PDF的文件名,下面是可运行的代码(运行代码之前需要先安装PyMuPDF库)。
准确率的话,我自己试了试,感觉还算可以,大家也可以试一试。
安装PyMuPDF库
pip install pymupdf
可运行代码
import os
import fitz
path = 'D:\文献改名'.replace('\\', '/')
respath = 'D:\文献改名'
paper_name = os.listdir(path)
i = 1
for temp in paper_name:
pdf_file = open(path + '/' + temp,'rb' )
pdf_reader = fitz.open(pdf_file) # 打开并建立一个PDF文件对象
try:
paper_title = pdf_reader.metadata["title"] # 获取metadata中的PDF标题
k=0
if paper_title == "" or len(paper_title)<10: #如果元信息无法获取title时采用这种方法
page = pdf_reader.load_page(0) #打开PDF第一页(一般论文题目都在首页),打开的页数也可更改
text=page.get_text("dict") #采用字典方式读取页面内容
for t in range(5): #一般标题在开头部分,只需要遍历前几个blocks
if t < len(text["blocks"]):
#print(text["blocks"][t])
if "lines" in text["blocks"][t]:
if text["blocks"][t]["lines"][0]["spans"][0]["size"]>10: #采用字号的大小来筛选title,字号可根据自身情况更改
if text["blocks"][t]["lines"][0]["spans"][0]["text"] != " ": #防止文本为空的block被选为title
k=t #确定title可能在第几个block
break
print("k",k)
title= page.get_text("blocks")
paper_title = title[k][4]
if len(paper_title) > 100: #特殊情况,防止title字符过长
paper_title=text["blocks"][k]["lines"][0]["spans"][0]["text"]
i = int(i)
print("i",i)
pdf_file.close()
pdf_reader.close()
#title符合windows命名规范
paper_title = str(paper_title).replace(':', ' ')
paper_title = paper_title.replace('/', ' ')
paper_title = paper_title.replace('\\', ' ')
paper_title = paper_title.replace('*', ' ')
paper_title = paper_title.replace('?', ' ')
paper_title = paper_title.replace('"', ' ')
paper_title = paper_title.replace("'", ' ')
paper_title = paper_title.replace('<', ' ')
paper_title = paper_title.replace('>', ' ')
paper_title = paper_title.replace('|', ' ')
paper_title = paper_title.replace('\n', ' ')
paper_title.rstrip() #去除末尾空格
new_name = paper_title+'.pdf'
print(new_name)
os.rename(path + '/' + temp, respath + '/' + str(i)+ '_' + new_name)
except FileNotFoundError:
print("error")
pass
i = i + 1
参考链接
Tutorial - PyMuPDF 1.23.4 documentation
The Basics - PyMuPDF 1.23.4 documentation
Appendix 1: Details on Text Extraction - PyMuPDF 1.23.4 documentation