Python实现批量PDF文件统计处理

前言

前几天突然接到导师的任务,要我把《International journal of Refrigeration》(国际制冷杂志)上面的2019年份文献全部下载,并分类整理好目录,要把文献按月份整理:


Python实现批量PDF文件统计处理_第1张图片

然后还要制作对应目录,格式也有相关要求


Python实现批量PDF文件统计处理_第2张图片

乍一看确实没什么难度,但是真的上手后发现极其麻烦,因为论文本身是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)

原本杂乱无章的文件夹


Python实现批量PDF文件统计处理_第3张图片

就按要求修改成了整齐的格式


Python实现批量PDF文件统计处理_第4张图片

非常简单好用,只需要对每个月份的文件夹下操作时,记得修改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文档


Python实现批量PDF文件统计处理_第5张图片

我们需要的读取文档的标题、页码、作者的信息就行了,大家如果要分类自己的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'来控制大小和字体,只要让这个脚本遍历文件夹下所有文件,即可实现论文目录的制作,最终效果

Python实现批量PDF文件统计处理_第6张图片

除了处理完一个文件夹后,切换另一个文件夹需要动下手,其他时间就让脚本自己在跑就行了,总共大约花了2个小时完工,轻轻松松,比起手动操作还要花个一两天要舒服的多。
具体代码请移步github:
https://github.com/huangchuhccc/Batch_PDF_processing/tree/master

你可能感兴趣的:(Python实现批量PDF文件统计处理)