연구업무를 하다보면 논문을 살펴볼 일이 많은 것 같습니다.
특히 초기단계에는 더 많지요.
이 때 저는 다음과 같은 과정을 통해서 조사를 합니다.
- 처음에 조사할 분야의 적당한 용어를 선택해서 논문 검색
- 다운로드 받은 논문들을 읽어보고 중요논문 선택
- 중요논문에서 참고한 문헌들 다시 조사
- 중요논문을 읽고 조사할 분야의 보다 적합한 검색 키워드 선정
- 새로운 키워드로 1번 부터 반복
여기서 2번 과정에서 항상 다운로드 받은 pdf 논문 파일들을 일일이 열어보는 과정을 해야하는데요. 이 과정이 은근히 귀찮아서 스크립트를 만들어봤습니다.
특정 디렉토리를 지정하면 그 디렉토리의 모든 하위 디렉토리에 있는 pdf 파일들의 파일명, 제목과 abstract의 목록을 만듭니다. 파일명에는 해당 파일로의 링크를 걸어서 보기 편하게 만들었습니다.
단점은 현재는
IEEE 2-column 형식만 지원한다는 것입니다. 그래도 대부분의 논문이 이 형식을 지원합니다.
필요하신 분들 가져다가 유용하게 쓰세요(
xpdf 툴킷 중 pdftotext.exe가 아래 python 스크립트와 같은 디렉토리에 있어야 합니다).
다른 형식을 지원하게 되었거나 향상된 점은 저에게도 알려주시구요.
# -*- coding: cp949 -*-
# Usage: "python pdflist.py starting_directory_path output_filename"
# This script find the pdf files recursively from starting_directory_path and
# get the title and the abstract of the file and build the list in HTML table.
#
# Written by guldook. 2008.1.6.
# You must let me know any changes you did (guldook at gmail)
import os, string, tempfile
import sys
def get_text(filename,start=0,end=0):
try:
cmd = "pdftotext.exe -f %d -l %d -enc UTF-8 %s -" % (start, end, filename)
f = os.popen(cmd)
text = f.read()
err = f.close()
if err is not None:
print 'unable to read %s' % filename
raise IOError
except IOError:
pass
except:
raise Exception,'unable to execute pdftotext'
return text
# paper must be formatted by IEEE 8.5 x 11-inch Proceedings Manuscripts, IEEE 2-column format
# refer http://www.computer.org/portal/site/cscps/menuitem.02df7cde46985ea21618fc2e6bcd45f3/index.jsp?&pName=cscps_level1&path=cscps/cps/final&file=wi06.xml&xsl=generic.xsl&
# I need to extend to other format
def get_info(fname):
title,abstract = None, None
try:
s = get_text(fname, 0, 10)
# get the index of 'Introduction' section
idx_abstract = s.index('Abstract')
# get the index of 'Introduction' section
idx_intro = s.index('Introduction')
title = s[:s.index('\n')]
abstract = " ".join(s[idx_abstract+len('Abstract'):idx_intro].split()).replace('\n','').replace(', ',' ')
title = '"' + title + '"'
abstract = '"' + abstract + '"'
except (IOError, ValueError):
raise
finally: return title,abstract
header = "<html>\n<title>%s directory pdf file summary</title>\n<body>\n<table>\n<tr><td>Link</td><td>Title</td><td>Abstract</td>\n"
footer = "</table></body>\n</html>"
def get_pdflist(path, outfn):
numlist = 0
f = open(outfn, "w+")
f.write(header % os.path.abspath(path))
for root, dirs, files in os.walk(path):
for fname in files:
if fname.endswith('.pdf'):
try:
title, abstract = get_info(os.path.join(root, fname))
if (title and abstract):
line = "<tr><td>"
link = "".join(['<a href="file:///', os.path.join(os.path.abspath(root), fname), '">', fname, '</a>'])
line += "</td><td>".join([link, title, abstract])
line += "</td></tr>"
f.write(line+"\n")
numlist += 1
except IOError, ValueError:
## line = ", ".join([fname, "N/A", "It must be standard IEEE 2-column format"])
## f.write(line+"\n")
continue
f.write(footer)
f.close()
if __name__ == '__main__':
if len(sys.argv) == 1:
get_pdflist('./test', "./pdflist.html")
elif len(sys.argv) != 3: print "Usage: pdflist.py start_path output_filename"
else : get_pdflist(sys.argv[1], sys.argv[2])