About 배우고 익히는법/Python

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

투명잉크 2019. 1. 4. 13:41

파이썬 공부를 하던 중, 꽤나 유용한 라이브러리를 발견했다. 필자는 코딩 중, 이미지 파일 혹은 파일의 목록들을 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() 메소드를 사용하여 현재 소스 코드 파일이 속한 디렉터리 경로를 아예 바로 구해버릴 수도 있다.