自動で論文タイトルにリネームしたい
皆さんは,論文のpdfファイルをダウンロードした際,ファイル名が意味のない数字やアルファベットの羅列になった経験はありますでしょうか.おそらく,論文を集める際に全員が通る道だと思います.
今回はPDFMINERを使って,Pythonでpdfを解析し,自動でタイトルを取得します.
なお,プログラムの作成に当たりこちらの記事をかなり参考にさせていただきました.先人って凄い!
PDFRename.py
import os
import sys
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams, LTContainer, LTTextLine
def get_objs(layout, results):
if not isinstance(layout, LTContainer):
return
for obj in layout:
if isinstance(obj, LTTextLine):
results.append({'text': obj.get_text(), 'height': obj.height})
get_objs(obj, results)
def get_title(path):
with open(path, "rb") as f:
parser = PDFParser(f)
document = PDFDocument(parser)
laparams = LAParams(all_texts=True)
rsrcmgr = PDFResourceManager()
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)
page = next(PDFPage.create_pages(document)) #1ページ目
interpreter.process_page(page)
layout = device.get_result()
results = []
get_objs(layout, results)
f.close()
title = max(results, key=lambda x:x.get('height'))
print(title.get('text'))
return title.get('text').strip()
def main(path):
os.rename(path, get_title(path)+".pdf")
if __name__ == '__main__':
path = sys.argv[1]
main(path)
get_objs関数内で扱っているobjはheightやwidthも取得できます.
このプログラムでは1ページ目にある一番heightが大きいオブジェクトをタイトルとしています.typeによる条件処理は行ってないのでたまに失敗します.興味ある方はぜひ挑戦してみてください!