提取论文标题并自动重命名pdf文件
在我们确定一个研究课题之后,我们总是会先下载一堆相关的paper,看看这个领域现在已经做到一个什么地步,也看看别人是怎么做的,后面自己写paper的时候可以参考参考。当我们把相关的文章都下载到一个文件夹之后,有一个问题,一般我们从IEEE或是ACM相关站点下载的PDF文件的文件名不是相应文章的标题。我们希望文件名尽量能够反映文件的主要内容,文章的标题显然是最能概括文张内容的。
昨天上午,一个小时的时间就花在把下载下来的文件重命名上了。因为太费时间,想自己写个简单的小程序来完成这个工作。上网一找,嗬,这方面的内容还不少,在stack overflow上面就有好几个帖子。这几个帖子我都看了,总结一下就是完成这个任务的方法有很多,可以用java来做,也可以python,还有C#,perl什么的都可以做,这些方法的一个共同点是需要额外的包或者模块来完成这个任务,java需要PDFBox,python需要PyPDF这个模块。
最后我选择的是用python来做。这是从简洁性角度考虑作出的选择,PyPDF模块的安装非常简单,安装之后编写程序也非常简单(就像一个小的脚本),还有python是跨平台的。选java的好处就是我可以将程序打包成EXE文件,非CS相关专业的学生可以会比较容易接受这种方式。
http://stackoverflow.com/questions/911672/extracting-titles-from-pdf-files
上面是stack overflow上面的相关页面。
http://pybrary.net/pyPdf/
这是下载pyPdf模块的页面,这个模块是作者一个人维护的,从10年4月开始就没有更新了,所以使用的Python版本还停留在2.x。
http://blog.isnotworking.com/2006/08/extract-pdf-title-from-all-files-on.html
这个页面给出了一个简答的例子。这个例子我在Python 2.7下运行通过。在3.2和3.3下运行报错,都是SyntaxError,3.x和2.x语法上还是存在比较大的差异的。
虽然可以自己手动修改PyPDF这个模块使之工作,但是我觉得没有必要。再说,A company named Phaseit has forked the project and continued development and maintenance with my blessing as pyPdf2 ( http://knowah.github.com/PyPDF2/). 或许这个 pyPdf2可以在3.x下工作,但我没有试过。
自动提取标题并重命名的代码如下:
# pyPdf available at http://pybrary.net/pyPdf/from pyPdf import PdfFileWriter, PdfFileReader import os for fileName in os.listdir('.'): actfile = file(fileName,"rb") try: if fileName.lower()[-3:] != "pdf": continue input1 = PdfFileReader(actfile) # print the title of document1.pdf print '##1', fileName, '##2', input1.getDocumentInfo().title() except: print '##1', fileName, '##2' try: trgtfilename = input1.getDocumentInfo().title + "_" + fileName except: print "\n## ERROR ## %s Title could not be extracted. PDF file may be encrypted!" % fileName continue del input1 actfile.close() print 'Trying to rename from:', fileName, '\n to ', trgtfilename try: os.rename(fileName,trgtfilename) except: print fileName, ' could not be renamed!' print '\n## ERROR ## Maybe the filename already exists or the document is already opened!'
一个问题:Python3.x的寻找模块方式和之前相比好像也有点变化,将PyPDF直接安装在site-packages下,运行的example的时候会提示找不到pdf这个模块,需要使用sys.path.add方法手动加上才行,现在还不知道为什么?
PS:当前的这个程序当目录下有文件夹时会报错!