파이썬 PDF 합치기, 매달 관공서 정산 서류 묶다가 홧병 날 뻔해서 직접 짠 코드

매달 마지막 주 금요일만 되면 입안이 바짝바짝 마른다. 낮에는 직장에서 상사 눈치 보며 월말 마감 보고서를 넘기고, 저녁에는 부랴부랴 작업복으로 갈아입고 안성하고 화성 일대 식당이며 상가 방역 현장을 한 바퀴 돌고 온다.

무거운 소독기 내려놓고 현관문 열면 밤 9시 반. 꼬리가 떨어져라 반겨주는 우리 집 시바견 반달이 턱 밑이랑 미간 한 번 쓱쓱 긁어주고, 옆집 리트리버 럭키네랑 잠깐 밤 산책 한 바퀴 돌고 오면 겨우 숨이 좀 붙는다. 아들이 곤히 잠든 방을 지나 작은 책상 스탠드를 켜면 시계는 어김없이 밤 10시 반을 가리킨다. 남들은 불금이라고 치맥 시켜 놓고 TV 볼 시간인데, 나 같은 투잡러에게 진짜 야근은 지금부터다.

한 달 동안 땀 흘려 일한 방역 대금을 청구하려면 관공서 주무관님들과 기업체 총무팀에 ‘완료 보고서랑 정산 서류’를 보내야 한다. 근데 이게 사람 피를 말린다.

그냥 파일 몇 개를 이메일에 주르륵 첨부해서 보내면 편하련만, 관공서나 큰 거래처들은 서류가 여러 개로 쪼개져 있는 걸 극도로 싫어한다. 무조건 하나의 파일로 묶어서 결재를 올려야 한단다. 표지부터 시작해서 월간 방역 소독 결과 보고서, 구역별 위치 지도, 소독필증 사본, 거기에 사업자등록증이랑 통장 사본, 국세·지방세 완납 증명서까지. 못해도 서류 일곱 개를 순서대로 착착 붙여서 ‘단 하나의 PDF 파일’로 만들어 내야 돈이 나온다.

거래처 한두 곳이면 웃으면서 하지. 서른 곳이 넘어가면 합쳐야 할 PDF 조각만 이백 개가 넘는다. 이때부터는 방역 업체 대표가 아니라 그냥 심야의 마우스 클릭 기계가 따로 없다. 결국 이 미련한 짓을 끝내려고 찾아낸 게 파이썬 PDF 합치기 코드였다.

무료 변환 사이트 쓰다가 등골이 오싹했던 기억

처음부터 코딩을 할 생각은 없었다. 나도 남들처럼 네이버에 ‘PDF 무료 병합’ 검색해서 나오는 사이트들을 썼다. 마우스로 파일 여섯 개 끌어다 놓고 합치기 버튼 누르면 끝이니 처음엔 세상 편한 줄 알았다.

근데 세상에 공짜가 어디 있던가. 거래처 두세 군데 서류를 합치고 나니 갑자기 “오늘의 무료 작업 한도를 초과했습니다. 프리미엄 요금제를 결제하세요”라는 창이 떡하니 뜬다. 밤 11시 반에 내일 아침 당장 보내야 할 서류는 스무 개가 넘게 남았는데 눈앞이 캄캄해진다. 급한 대로 다른 무료 사이트를 찾아 들어가면 화면 절반을 가리는 이상한 광고 배너가 정신없이 깜빡거리고, 어떤 곳은 합쳐진 파일 맨 아랫단에 자기네 사이트 워터마크를 쾅 찍어놓기도 한다.

그렇다고 어도비 아크로뱃 정품을 구독하자니, 한 달에 한두 번 파일 합치는 용도로만 쓰기엔 매달 빠져나가는 구독료가 영 아까웠다.

무엇보다 결정적으로 무료 사이트들을 손절하게 된 계기는 ‘보안’ 때문이었다. 어느 날 밤, 평소처럼 해외 무료 변환 사이트에 서류를 업로드하다가 문득 등골이 서늘해졌다. 내가 지금 올리고 있는 파일 안에 우리 업체 통장 계좌번호, 사업자등록번호, 거래처 계약 단가, 심지어 관공서 담당자 연락처까지 전부 들어있는데, 이걸 정체도 모르는 외국 서버에 내 손으로 갖다 바치고 있었던 거다. 만약 그 서버가 해킹이라도 당해서 거래처 기밀이 새어 나간다면? 상상만 해도 아찔했다.

내 컴퓨터 밖으로 파일을 단 1바이트도 내보내지 않고, 인터넷 선을 뽑아놓은 상태에서도 평생 무료로 무제한 병합할 수 있는 방법. 그 유일한 탈출구가 바로 내 노트북에 깔아둔 파이썬이었다.

단 서른 줄로 끝내는 파이썬 PDF 합치기 실전 코드

파이썬으로 PDF 파일을 다룰 때 가장 만만하고 고장 안 나는 도구가 pypdf라는 녀석이다. 예전에는 PyPDF2라는 이름을 썼다는데, 최근에 업데이트되면서 이름이 짧아지고 속도도 훨씬 빨라졌다고 한다.

먼저 VS Code를 열고 아래쪽 터미널 창에 이 한 줄만 치면 준비는 끝난다. 돈 한 푼 안 드는 평생 무료 문서 편집기를 내 컴퓨터에 설치하는 셈이다.

pip install pypdf

설치가 끝났으면 이제 폴더 안에 흩어져 있는 서류들을 하나로 묶어줄 차례다. 아래 코드는 내가 매월 말일 밤에 안성시청을 비롯한 거래처 제출용 서류들을 번호 순서대로 착착 읽어 들여서, 딱 하나의 파일로 묶어낼 때 실제로 돌리고 있는 코드다.

Python

import os
from pypdf import PdfWriter

# 합칠 PDF 조각들이 모여 있는 폴더와 최종 완성본이 저장될 이름
source_folder = r"C:\Users\Admin\Desktop\스마트방역_10월_제출서류모음"
output_pdf = r"C:\Users\Admin\Desktop\스마트방역_10월_안성시청_최종제출본.pdf"

# 빈 PDF 묶음 도구 하나 꺼내기
merger = PdfWriter()

# 폴더 안의 파일들을 이름순(01, 02, 03...)으로 줄 세우기
file_list = sorted(os.listdir(source_folder))

print("파이썬 PDF 합치기 작업을 시작합니다...")

merged_count = 0

for filename in file_list:
    # 혹시 폴더에 이미지나 엑셀이 섞여 있어도 .pdf 파일만 골라내기
    if filename.lower().endswith(".pdf"):
        full_path = os.path.join(source_folder, filename)
        
        try:
            merger.append(full_path)
            print(f" -> 차곡차곡 붙이는 중: {filename}")
            merged_count += 1
        except Exception as e:
            print(f" [에러] 이 파일은 열리지 않아서 건너뜁니다 ({filename}): {e}")

# 다 붙였으면 바탕화면에 새 파일로 도장 쾅 찍어 저장하기
if merged_count > 0:
    merger.write(output_pdf)
    merger.close()
    print(f"\n총 {merged_count}개의 서류가 단 하나의 파일로 깔끔하게 묶였습니다!")
else:
    print("합칠 PDF 파일이 하나도 없네요. 폴더 경로를 다시 확인해 보세요.")

이 파이썬 PDF 합치기 코드를 처음 짜서 돌려보던 날 밤의 허탈한 웃음이 아직도 기억난다.

그동안 무료 사이트 돌아다니면서 광고 닫기 버튼 누르고, 마우스로 파일 순서 끌어다 맞추느라 한 시간 넘게 낑낑거렸던 작업이, 엔터 키 한 번 치니까 진짜 거짓말 안 보태고 1초 만에 끝났다. 터미널 창에 파일 이름 여섯 개가 드르륵 올라가더니 바탕화면에 서른 페이지짜리 통합본 PDF가 툭 튀어나왔다.

지금은 아예 거래처별로 폴더를 만들어 두고, 매달 똑같이 들어가는 사업자등록증이랑 통장 사본은 그 안에 붙박이로 넣어둔다. 그리고 매달 새로 뽑는 방역 결과 보고서랑 구역 지도 파일만 그 폴더에 쓱 덮어씌운 다음 코딩 실행 버튼만 누르면 그 자리에서 이번 달 청구 서류 세트가 완성된다.

표지 바로 뒷장에 납세증명서가 끼어들어 간 아찔한 실수담

물론 처음부터 이렇게 매끄럽게 돌아갔던 건 아니다. 직접 부딪히면서 등줄기에 식은땀 한 바가지 흘렸던 시행착오가 두 번 있었는데, 이 코드를 가져다 쓰실 분들은 부디 나 같은 실수를 안 하셨으면 좋겠다.

한번은 시청 주무관님께 보낼 서류가 딱 열 개여서 파일 이름을 1_표지.pdf, 2_방역보고서.pdf… 이렇게 붙여서 10_완납증명서.pdf까지 폴더에 넣고 코드를 돌렸다. 그리고 파일이 잘 만들어졌길래 열어보지도 않고 그대로 이메일에 첨부해서 보냈다.

다음 날 아침에 주무관님한테 전화가 왔다. “대표님, 보내주신 서류 열었는데 표지 넘기자마자 바로 세금 완납 증명서가 나오는데요?”

화들짝 놀라서 내 컴퓨터에 있는 파일을 열어보니 진짜로 1번 표지 바로 다음 페이지에 10번 서류가 떡하니 끼어들어 가 있었다. 알고 보니 컴퓨터는 숫자를 사람처럼 ‘일, 이, 삼… 십’으로 읽는 게 아니라 무조건 맨 앞 글자부터 비교해서 줄을 세운단다. 그러니까 앞자리가 똑같이 1로 시작하는 1_표지와 10_완납증명서를 나란히 붙여놓고, 그 뒤에 2_방역보고서를 붙인 거였다.

그날 이후로는 파이썬 PDF 합치기를 돌릴 때 파일 번호를 무조건 01_, 02_, 03_… 10_처럼 앞에 0을 붙여서 두 자리 숫자로 맞추는 버릇이 생겼다. 이렇게 자리만 맞춰주면 서류 순서가 뒤죽박죽될 일이 절대 없다.

또 하나 골치 아팠던 건 홈택스나 정부24에서 떼어 온 증명서 파일들이었다. 다른 파일들은 다 잘 합쳐지는데 유독 관공서에서 발급받은 증명서 PDF만 들어가면 코드가 빨간 에러를 뱉으면서 멈추는 거다. 왜 그런가 했더니 공공기관에서 발급한 PDF에는 위변조 방지용 보안 암호가 살며시 걸려 있어서 파이썬이 파일 안쪽을 건드리지 못하게 막아둔 거였다.

이거 해결하는 방법은 의외로 허무할 만큼 간단하다. 말썽 부리는 증명서 PDF 파일을 크롬(Chrome) 인터넷 창으로 끌어다 열면 화면에 잘 보인다. 그 상태에서 오른쪽 위에 있는 인쇄 버튼을 누르고, 종이 프린터 대신 PDF로 저장을 골라서 내 컴퓨터에 다시 저장해 주면 된다. 이렇게 한 번 거쳐서 저장하면 겉에 씌워져 있던 까다로운 보안 껍데기가 싹 벗겨져서 파이썬이 아무 저항 없이 스르륵 합쳐준다. 만약 전체 파일이 아니라 특정 문서의 1페이지부터 3페이지까지만 쏙 뽑아서 합치고 싶다면 pypdf 공식 문서 병합 가이드에 나와 있는 페이지 슬라이싱 예제를 살짝 베껴 쓰면 금방 해결된다.

밤 11시에 컴퓨터를 끄고 거실로 나오는 기분

마흔이 넘어서 낮에는 직장인으로, 밤과 주말에는 작은 방역 업체의 대표로 산다는 건 늘 체력과의 싸움이다. 예전 같으면 “내가 조금만 덜 자고 손으로 더 빨리 클릭하면 되지”라며 몸을 갈아 넣었겠지만, 이제는 안다. 그렇게 버티는 건 결국 탈이 난다는 걸.

단순히 파일 몇 개 순서 맞춰서 묶는 일에 내 소중한 일요일 밤을 바칠 필요는 없다. 오늘 적어둔 파이썬 PDF 합치기 코드 서른 줄이면 기계가 1초 만에 해치울 일이다.

덕분에 요즘은 월말 정산 서류 작업을 밤 11시 전에 가뿐하게 끝낸다. 일찍 컴퓨터 전원을 끄고 거실로 나와서, 소파 옆에 배를 까고 누운 반달이 배를 북북 문질러 주며 시원한 물 한 잔 마시는 그 30분의 여유. 내가 눈 침침해가며 까만 코딩 화면과 씨름했던 보상은 바로 이 조용하고 평화로운 밤 시간에 있다.

혹시 오늘 합친 이 PDF 서류 뭉치 중에서 가장 중요한 ‘월간 결과 보고서 원본’ 자체를 매번 워드 프로그램으로 타이핑하느라 고생하고 계신다면, 내가 바로 앞 글에 적어두었던 [파이썬 워드 문서 자동 생성: 40대 N잡러가 관공서 방역 보고서 야근 끝낸 비결] 이야기를 꼭 한 번 읽어보셨으면 좋겠다. 워드로 보고서를 3초 만에 찍어내고, 오늘 코드로 증빙 서류까지 하나로 묶어버리면 월말 서류 스트레스는 거짓말처럼 사라질 거다.

오늘도 가족들이 다 잠든 시간에 홀로 책상 스탠드를 켜고 내일의 서류를 챙기고 계실 대한민국의 모든 40대 가장, 그리고 N잡러 동료분들에게 심심한 응원을 보낸다. 화이팅

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다