前言
前几天突然接到导师的任务,要我把《International journal of Refrigeration》(国际制冷杂志)上面的2019年份文献全部下载,并分类整理好目录,要把文献按月份整理:
然后还要制作对应目录,格式也有相关要求
乍一看确实没什么难度,但是真的上手后发现极其麻烦,因为论文本身是PDF格式,而且论文字体格式不对应,因此每篇论文如果手动修改文件名并且制作目录的话,2019年共300篇文献够我干一整天了。
突然想到python有OS操作,而且还有pdfminer这个很好用的开源库,感觉能写一个脚本自动完成文件改名和目录统计。
师兄说往年他们都是手动操作的,有时候两天都弄不完,如果我这个脚本成功了说不定还能造福以后的师弟~~
文件改名
可以直接用python自带的OS库,能直接对系统文件进行操作,代码如下
import os
movie_name = os.listdir('./July')
i=1
for temp in movie_name:
new_name = '2019 Jul-' + str(i)+'.pdf'
i=i+1
os.rename('./July/'+temp,'./July/'+new_name)
原本杂乱无章的文件夹
就按要求修改成了整齐的格式
非常简单好用,只需要对每个月份的文件夹下操作时,记得修改new_name变量里的月份字符。
制作目录
这是整个部分的大头,手动操作的话极其耗时,我们这里用到了pdfminer和docx的开源库,pdfminer能读取pdf文件内容,docx能对word文件进行操作,直接把pdfminer读取到的内容按固定格式输出到word里。
如果没有安装的同学可以自行百度安装方法,可以直接pip指令安装,但是python2和python3的安装指令是不同,对于python3指令如下,python2后面去掉3k就行
pip install pdfminer3k
包含头文件如下,并且定义一个读取pdf的函数,具体每一句的原理可以不去深究,在后面直接改就可以很好的调用了
import os
from io import StringIO
from io import open
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from docx import Document ##文件操作
from docx.shared import Pt ##字体操作
from docx.shared import RGBColor ##颜色操作
def read_pdf(pdf):
# resource manager
rsrcmgr = PDFResourceManager()
retstr = StringIO()
laparams = LAParams()
# device
device = TextConverter(rsrcmgr, retstr, laparams=laparams)
process_pdf(rsrcmgr, device, pdf)
device.close()
content = retstr.getvalue()
retstr.close()
# 获取所有行
lines = str(content).split("\n")
return lines
之后根据我们要转换的pdf文档
我们需要的读取文档的标题、页码、作者的信息就行了,大家如果要分类自己的pdf,可以先对一篇文章调用pdfminer读取,看看读取内容的顺序是怎样的。
我下面的代码就是根据我这片文章的string的split的规律,自己找到了需要提取的字段位置
article_name = os.listdir('G:\婴儿识别项目\TEMP')
article_name.sort()
i=1
test = Document()
p = test.add_paragraph(u'目录')
for article in article_name:
# if i<=8 :
# i=i+1
# continue
run = p.add_run(article[:len(article)-4])
run.font.size = Pt(12)
run.font.name=u'Arial'
run.font.color.rgb=RGBColor(0,0,255)
run.bold=True
run = p.add_run('\n')
if __name__ == '__main__':
with open(article, "rb") as my_pdf:
lines=read_pdf(my_pdf)
count=0
for line in lines:
if count==0:
count=1
continue
if line==u'∗':
break
if line=='Contents lists available at ScienceDirect' or line=='' or line=='International Journal of Refrigeration ' or line=='journal homepage: www.elsevier.com/locate/ijrefrig ' or line=='a , ' or line=='b , ' or line=='c , ' or line=='d , ' or line=='e , ':
continue
run = p.add_run(line)
run.font.size = Pt(12)
run.font.name=u'Arial'
#print (lines[0])
run = p.add_run('\n')
run = p.add_run(lines[0])
run.font.size = Pt(12)
run.font.name=u'Arial'
run = p.add_run('\n')
run = p.add_run('\n')
#text.close()
test.save(u'C:/Users/Administrator/Desktop/目录.docx')
每找到一具目标语句,就调用run=p.add_run(line)插入word文件中,run.font.size = Pt(12) ; run.font.name=u'Arial'来控制大小和字体,只要让这个脚本遍历文件夹下所有文件,即可实现论文目录的制作,最终效果
除了处理完一个文件夹后,切换另一个文件夹需要动下手,其他时间就让脚本自己在跑就行了,总共大约花了2个小时完工,轻轻松松,比起手动操作还要花个一两天要舒服的多。
具体代码请移步github:
https://github.com/huangchuhccc/Batch_PDF_processing/tree/master