在我們確定一個研究課題之后,我們總是會先下載一堆相關的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:當前的這個程序當目錄下有文件夾時會報錯!