본문 바로가기

About 배우고 익히는법/Python

[Python] 이미지 파일을 PDF 파일로 변환하기

파이썬 공부를 하던 중, 꽤나 유용한 라이브러리를 발견했다. 필자는 코딩 중, 이미지 파일 혹은 파일의 목록들을 PDF 파일로 변환할 필요가 있었는데, 서드파티 라이브러리를 찾아보니 엄청 편리한 게 있었다.

img2pdf 설치
라이브러리의 이름도 매우 직관적이게 'img2pdf'이다. 해당 라이브러리는 파이썬 3.x 이상에서만 지원함으로 유의하도록 하고, 설치 방법은 아래의 명령어를 쳐주면 된다.

$ pip install img2pdf


인자를 위한 위한 경로 값 전달 
파일을 변환하는 메소드이기 때문에 당연히 경로 및 파일 이름을 인자로 받아야 한다. 그러므로 경로 등에 접근할 수 있는 기본 라이브러리인 'os' 등과 함께 사용할 필요가 있다. 간단하게만 알아보자.

글로벌 변수 __file__
해당 코드가 저장된 파일의 이름을 반환한다.
ex) code.py

os.path.realpath("code.py")
파일 이름을 인자로 주면 해당 파일의 절대 경로를 반환하여 준다.
ex) C:\Users\code.py

os.path.dirname("C:\Users\code.py")
파일의 경로를 인자로 주면 해당 파일이 속한 디렉터리의 경로를 반환하여 준다.
ex) C:\Users

os.listdir("C:\Users")
디렉터리 경로를 인자로 주면 해당 디렉터리 내에 존재하는 모든 파일 및 디렉터리를 리스트로 반환한다.
ex)["code.py","qwe.jpg","asd.jpg","zxc.jpg"]



예제 코드
img2pdf를 사용할 준비는 끝났으니 예제 코드를 사용하여 직접 실행시켜 보자.

# code.py import os from img2pdf import convert # outpath1 == outpath2 == outpath3 outpath1 = "C:\\Users\\IML\\Desktop" outpath2 = os.path.dirname(os.path.realpath(__file__)) outpath3 = os.path.dirname(os.path.realpath('__file__')) with open("out.pdf", "wb") as f: pdf_list = [] for file in os.listdir(outpath3): if file.endswith(".jpg"): pdf_list.append(file) pdf = convert(pdf_list) f.write(pdf)
// code.py과 같은 경로에 out.pdf 파일이 생성되었음. // 필자의 경우 그게 "C:\\Users\\IML\\Desktop", 즉 바탕화면이었다.

먼저 outpath 1,2,3 변수들에 주목하자. 주석에도 설명되어 있듯이 세 변수의 값은 완전히 일치한다. 첫 번째 변수와 같이 직접 문자열을 입력해줘도, os 라이브러리의 메소드를 사용하여 경로값을 줘도 무방하다.
listdir() 메소드를 사용하여 파일 목록을 호출하여 endswith() 메소드로 jpg 파일만을 찾아내서 리스트에 추가한다. 만약 좀 더 복잡한 조건을 걸고 싶다면 정규표현식을 사용하도록 하자.

그 후, 선별된 파일 리스트를 
img2pdf.convert() 메소드에 인자로 넘겨준 후, 해당 객체로 파일에 쓰면 완성이다.

주의사항
파이썬 인터프리터로 실행시킬 때는, outpath2 및 outpath3 모두 문제없이 구동되는 것을 확인할 수 있다. 그러나, Windows application(.exe 파일)로 포팅할 시에는 문제가 생긴다.

NameError: global name '__file__' is not defined

위 에러가 뜨는 이유는 포팅된 Windows의 exe 파일은 파이썬에서 지원하는 글로벌 변수(__변수__)에 접근할 수 없기 때문이다.  그렇기 때문에 실제 글로벌 변수 __file__ 가 아닌,  
sys.argv[0] 및 '__file__'를 대신 사용하여 현재 코드의 파일 이름을 찾아낼 수 있다.

혹은 os.getcwd() 메소드를 사용하여 현재 소스 코드 파일이 속한 디렉터리 경로를 아예 바로 구해버릴 수도 있다.