![[파이썬 07] PDF 병합/분할/텍스트추출 한번에 정리](https://img.thenullpage.com/posts/5385/5385_1_21e7c1.webp)
PDF는 문서를 다룰 때 가장 흔히 쓰이는 포맷이지만, 편집이 까다롭다는 게 항상 골칫거리다. 매일 지메일과 구글 드라이브에만 7,300만 개가 넘는 새 PDF 파일이 저장된다는 통계가 있을 만큼 방대한 양이 오가는 포맷인데, 이 PDF를 코드로 다룰 수 있게 해주는 대표적인 라이브러리가 PyPDF2(현재는 후속 프로젝트인 pypdf)다.
1. PyPDF2/pypdf 설치와 기본 개념
pip install pypdf
원래 이름은 PyPDF2였는데, 2016년 이후 유지보수가 중단됐다가 2022년에 부활하면서 pypdf라는 이름으로 이어지고 있다. 기존 PyPDF2 코드도 대부분 그대로 동작하지만, 최신 문서에서는 pypdf 쪽 이름을 표준으로 안내하는 경우가 많다.
2. PDF 텍스트 추출하기
PDF 파일 하나를 열어서 페이지별로 텍스트를 뽑아내는 코드는 다음과 같다.
from pypdf import PdfReader
reader = PdfReader("계약서.pdf")
print("전체 페이지 수:", len(reader.pages))
for page in reader.pages:
text = page.extract_text()
print(text)
다만 이 방식은 순수 텍스트 위주의 PDF에서는 잘 동작하지만, 표나 복잡한 레이아웃이 있는 문서에서는 텍스트가 뒤섞여 추출될 수 있다. 이런 경우엔 표 구조까지 인식하는 pdfplumber 같은 라이브러리를 함께 쓰는 것이 일반적으로 권장된다.
3. 여러 PDF 합치기
계약서나 보고서처럼 여러 개의 PDF 파일을 하나로 합쳐야 하는 상황에서 자주 쓰이는 기능이다.
from pypdf import PdfWriter
writer = PdfWriter()
for pdf in ["1월보고서.pdf", "2월보고서.pdf", "3월보고서.pdf"]:
writer.append(pdf)
writer.write("1분기_통합보고서.pdf")
4. PDF 나누기
반대로 큰 PDF를 페이지 단위로 쪼개고 싶을 때도 있다. 예를 들어 수십 페이지짜리 매뉴얼에서 필요한 페이지만 따로 추출해서 보내야 할 때다.
from pypdf import PdfReader, PdfWriter
reader = PdfReader("전체매뉴얼.pdf")
for i, page in enumerate(reader.pages):
writer = PdfWriter()
writer.add_page(page)
writer.write(f"페이지_{i+1}.pdf")
이 코드는 PDF의 각 페이지를 개별 파일로 저장한다. 특정 범위(예: 3페이지부터 10페이지까지)만 잘라내고 싶다면 반복문의 범위를 조절하면 된다.
5. 비밀번호 걸기/풀기
기업 문서 중에는 외부 유출 방지를 위해 비밀번호를 거는 경우가 많은데, 이 작업도 코드로 자동화할 수 있다.
from pypdf import PdfReader, PdfWriter
reader = PdfReader("기밀문서.pdf")
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
writer.encrypt("비밀번호123")
writer.write("암호화된_기밀문서.pdf")
수십, 수백 개의 문서에 동일한 비밀번호를 걸어야 하는 상황에서는 이 스크립트를 반복문과 결합해 폴더 안의 모든 PDF에 일괄 적용하는 식으로 확장할 수 있다.
6. 실전 조합, 폴더 안 PDF 전체 병합
앞서 다룬 os 모듈과 결합하면, 폴더 안의 모든 PDF를 자동으로 찾아 합치는 스크립트도 만들 수 있다.
import os
from pypdf import PdfWriter
folder = "월간보고서_모음"
writer = PdfWriter()
for filename in sorted(os.listdir(folder)):
if filename.endswith(".pdf"):
writer.append(os.path.join(folder, filename))
writer.write("전체_통합.pdf")
7. 정리
pypdf(PyPDF2)는 텍스트 추출, 병합, 분할, 암호화까지 PDF와 관련된 반복 작업 대부분을 코드 몇 줄로 처리할 수 있게 해준다. 다만 표나 복잡한 레이아웃이 있는 문서의 텍스트 추출 정확도는 떨어질 수 있어서, 그런 경우엔 pdfplumber 같은 보조 도구를 함께 쓰는 것이 낫다.