pdf를 쉽게 접근할 수 있는 html이나 text 파일 형식으로 변환하고자 할 때, 그 와중에 웹 상에서 제공하는 변환 서비스를 이용하긴 꺼림칙하고 파이썬 코딩으로 간편하게 할 수 있는 방법이 없을까..? 싶을 때. 결국 최종적으로 당신이 도착할 곳은 PDFMiner일 것이라고 생각한다. 모듈 설치 후 바로 사용할 수 있는 코드도 제공하기 때문에 속도에 크게 신경 쓰지 않고 사용하기에는 큰 불편이 없을 것 같다. 참, PDFMiner 모듈은 Python 2 버젼에서만 사용 가능하다고 하니 참고하자.

1. 설치

pip 명령어를 이용하면 간단히 설치 가능.

pip install pdfminer

다만 한중일 언어 (CJK Languages) 의 pdf 문서도 변환하기 위해서는 별도의 설치 과정이 필요하다. 우선 소스 파일을 여기저기서 다운 받고 압축을 풀자.

* 윈도우를 사용한다면

압축을 푼 폴더 (아마도 pdfminer-20140328이라는 이름일 것이다) 에 가서 명령창을 연다. (모르는 사람이 있다면 꿀팁: 탐색기에서 shift+우클릭을 하면 메뉴에 "여기서 명령창 열기" 라는 새로운 명령을 볼 수 있다) 그리고 아래 명령어들을 입력하자.

mkdir pdfminer
python tools\conv_cmap.py -c B5=cp950 -c UniCNS-UTF8=utf-8 pdfminer\cmap Adobe-CNS1 cmaprsrc\cid2code_Adobe_CNS1.txt
python tools\conv_cmap.py -c GBK-EUC=cp936 -c UniGB-UTF8=utf-8 pdfminer\cmap Adobe-GB1 cmaprsrc\cid2code_Adobe_GB1.txt
python tools\conv_cmap.py -c RKSJ=cp932 -c EUC=euc-jp -c UniJIS-UTF8=utf-8 pdfminer\cmap Adobe-Japan1 cmaprsrc\cid2code_Adobe_Japan1.txt
python tools\conv_cmap.py -c KSC-EUC=euc-kr -c KSC-Johab=johab -c KSCms-UHC=cp949 -c UniKS-UTF8=utf-8 pdfminer\cmap Adobe-Korea1 cmaprsrc\cid2code_Adobe_Korea1.txt

한 줄씩 실행하면 명령창에서 열심히 뭔가 쓰여지는 것을 확인할 수 있다. 위 작업들이 다 끝나고 나면 마지막으로 설치 명령어를 실행하면 된다.

python setup.py install

2. 사용 예제

소스 코드 안에서 제공되는 코드들이 있다. 소스 코드 폴더 내의 tools 폴더 안에 pdf2txt.py라는 파이썬 코드를 실행하면 바로 별도의 코딩 없이 pdf 문서를 변환할 수 있다.

pdf2txt.py -o output.html samples/pdf.pdf

-o 변환될파일이름.html

-o 변환될파일이름.txt

변환될 파일이름의 확장자를 알아서 읽어서 그 형식에 맞게 html 또는 txt파일을 만들어 줄 것이다. 저 pdf2txt.py을 직접 보면 어떤 식으로 작동하는 것인지 대충은 알 수 있을 것이다.

3. 사용 방법

한 줄의 명령으로 pdf 변환을 할 수 있게 해주는 pdf2txt.py 소스코드를 조금만 살펴보면 내가 원하는 설정으로 pdf를 변환할 수 있는 python 코드를 직접 작성할 수 있을 것이다. 다음은 pdf파일을 파일 브라우저로 직접 선택해서 pdf2output.html 파일로 변환하는 코드이다.

# -*- coding: utf-8 -*-
from tkFileDialog import askopenfilename
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice, TagExtractor
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter
from pdfminer.cmapdb import CMapDB
from pdfminer.layout import LAParams
from pdfminer.image import ImageWriter

password = ''
pagenos = set()
maxpages = 0
# output option
outfile = None
outtype = None
imagewriter = None
rotation = 0
layoutmode = 'normal'
codec = 'utf-8'
codec = 'euc-kr'
pageno = 1
scale = 1
caching = True
showpageno = True
laparams = LAParams()

fpname = askopenfilename()
fp = file(fpname, 'rb')

outfpname = 'pdf2output'

rsrcmgr = PDFResourceManager(caching=caching)
outfp = file(outfpname + '.txt', 'w')
device = TextConverter(rsrcmgr, outfp, codec=codec, 
laparams=laparams, imagewriter=imagewriter) interpreter = PDFPageInterpreter(rsrcmgr, device) for page in PDFPage.get_pages(fp, pagenos,                               maxpages=maxpages, password=password,                               caching=caching, check_extractable=True):     page.rotate = (page.rotate+rotation) % 360     interpreter.process_page(page)      outfp.close() rsrcmgr = PDFResourceManager(caching=caching) outfp = file(outfpname + '.html', 'w') device = HTMLConverter(rsrcmgr, outfp, codec=codec, scale=scale,                        layoutmode=layoutmode, laparams=laparams,                        imagewriter=imagewriter) interpreter = PDFPageInterpreter(rsrcmgr, device) for page in PDFPage.get_pages(fp, pagenos,                               maxpages=maxpages, password=password,                               caching=caching, check_extractable=True):     page.rotate = (page.rotate+rotation) % 360     interpreter.process_page(page) outfp.close() fp.close()



참고자료

공식 페이지: 설치법, 사용법 등에 대한 설명을 담고 있고, 웹에서 직접 시범 사용을 할 수도 있다.
http://www.unixuser.org/~euske/python/pdfminer/index.html


  • py 2016.06.24 22:09

    안녕하세요, pdf를 txt파일로 변환할 수 있는 방법을 찾고 있었는데, 좋은 프로그램 소개해주셔서 감사드립니다. 그런데 이 프로그램은 커맨드 창에서 하나 하나의 파일을 각각 변환할 수밖에 없는건지요? 디렉토리 내 여러 개의 파일을 일괄 변환할 수 있는 방법은 없는지 궁금합니다.

    BlogIcon 동건 2016.06.27 14:59 신고

    아무래도 pdfminer에 설치시 기본으로 쓸수 있는 커맨드라인 툴로는 하나씩 변환할 수 있을 것 같습니다. python에서 pdfminer 모듈을 통해 변환하는 코드를 직접 작성하시면 될 것 같은데요, 제가 그 부분을 아직 추가하지 못했습니다.. 급하신 거면 pdfminer 공식 도움말을 보시거나 구글링을 해보셔야 할 듯 싶습니다. 조만간 내용에 추가하겠습니당.

    BlogIcon 동건 2016.06.29 21:24 신고

    pdfminer 모듈 자체를 이용해서 직접 pdf를 변환하는 코드를 추가했습니다. 이를 이용하시면 원하시는 작업을 하실 수 있을 것 같습니다.

  • 2017.12.02 14:56

    비밀댓글입니다

    BlogIcon 동건 2017.12.21 21:02 신고

    아 감사합니다!

  • BlogIcon 초코비니 2017.12.09 02:30 신고

    안녕하세요.

    혹시 해당 라이브러리로 PDF 표를 HTML 변환 시 <table> <tr> <td> ....이런 형식으로 뽑을 수 있나요?
    원래 자바 개발자인대...해당 기능을 지원하는 라이브러리가 없길래 파이썬까지 찾아오게 되었네요. 답변 주시면 감사드리겠습니다.
    좋은 하루 되세요.

    BlogIcon 동건 2017.12.21 21:09 신고

    안녕하세요, 늦은 + 도움이 못 되는 댓글을 달게 되어 죄송합니다.

    pdf 변환 쪽이 가물가물 한데요, 제가 알기로 html로의 변환이 그렇게 깔끔하게 되지 않는 걸로 알고 있습니다. 어느 언어의 어느 모듈을 쓰느냐로 개선할 수 있는 레벨이 아니라고 알고 있는데요. 이게 2015년 쯤 기억이라 제가 잘못 알고 있거나 상황이 개선되었을 수도 있을 것 같습니다.

    또한 제 오랜 기억으로는 그나마 https://github.com/coolwanglu/pdf2htmlEX 이 프로젝트가 괜찮았던 것 같습니다.

    확실하지 않은 내용만 말씀드려 죄송합니다.

  • 파이썬3.6 2018.01.24 17:54

    안녕하세요?

    파이썬3.6버전을 이용하던중, pdf 텍스트추출 공부중에 들러봅니다.
    pdfminer를 이용해서 pdf 내의 내용 중, (메타데이터에의한 파일 속성이 아닙니다.) 원하는 부분만 출력할려고 하는데 구글링해도 도통 모르겠더군요...ㅠ

    예를 들어, 논문 경우, 출력시 =>제목 : 무슨무슨논문 저자: ㅇ ㅇㅇ 요약:~~~~
    이런식으로 구분지어서 하고 싶은데
    도통 모르겠더군요. 구글링해도 답변이 없거나 pdfminer이용하라 하는데 pdfminer홈페이지에서도 딱히 없더군요
    html은 태그로 찾아서 하면 되는데 pdf 경우, 폰트로 구분해야할거 같아서 그쪽으로 찾아보는데
    역시 알수없었습니다...OTL..



    혹시, 답변 주실수 있으면 감사드리겠습니다.

    좋은 하루 되세요.


    BlogIcon 동건 2018.01.29 21:10 신고

    안녕하세요. 우선 제가 무슨 답변을 드릴 수 있는 지 모르겠습니다. pdfminer를 이용하는 방법인지 / pdf에서 원하는 부분을 출력하는 기능 같은 것이 있는지에 대해 알고 싶으신 건지 잘 모르겠네요.

    결론적으로 말씀드리자면 pdfminer (또는 여타 다른 변환 프로그램이든)를 통해서 그런 작업을 쉽게 해결할 수는 없다고 생각합니다. pdf를 html/txt로 변환한 결과물은 인간이 직접 웹사이트를 위해서 의미있게 쓴 HTML과는 그 질이 다릅니다 (폰트로 구분한다고 하셨는데, 저도 꽤 오래 전에 쓴 포스팅이라 기억이 잘 안납니다만 변환된 html에서 폰트 정보를 찾을 수 있으리라고는 생각이 되지 않습니다).

    결국 제가 드릴 수 있는 말씀은 직접 pdf를 변환해서 결과물을 보시고 질문하시는 분의 데이터 내에서 필요한 패턴을 찾아보시라는 것입니다. 그리고 이 것은 굉장히 data-specific 한 문제여서 "어떤 프로그램을 써서 해결한다"고 생각하기 어려울 것 같습니다.

    별 도움이 안 될 것 같은 답변에 송구합니다.