파이썬 pypdf·pdfplumber PDF 자동화: 추출·병합·분할
pypdf와 pdfplumber의 역할을 비교하고 PDF 텍스트·표 추출, 페이지 병합·분할, 스캔 문서 OCR 판단과 검증 절차를 정리합니다.

PDF 자동화는 한 도구로 모두 해결하기보다 목적에 따라 나누는 것이 정확합니다. 페이지 병합·분할·회전은 pypdf, 문서의 글자 위치와 표 구조를 추출하는 작업은 pdfplumber가 적합합니다. 스캔 이미지 PDF는 두 라이브러리만으로 글자를 읽을 수 없으므로 OCR 단계를 별도로 추가해야 합니다.
핵심 요약
- pypdf는 PDF 페이지 병합·분할·회전·메타데이터와 텍스트 추출을 지원합니다.
- pdfplumber는 문자·선·사각형 위치 정보와 표 추출, 시각적 디버깅에 강합니다.
- 텍스트 선택이 안 되는 스캔 PDF는 OCR 도구가 필요합니다.
- 자동화 전 암호화 여부, 페이지 수, 출력 경로와 원본 보존 정책을 확인하세요.
pypdf와 pdfplumber 선택 기준
| 작업 | 추천 도구 | 주의점 |
|---|---|---|
| 페이지 병합·분할·회전 | pypdf | 원본을 덮어쓰지 않기 |
| 일반 텍스트 추출 | pypdf 또는 pdfplumber | 읽기 순서가 화면 순서와 다를 수 있음 |
| 표·좌표·선 구조 분석 | pdfplumber | 문서 레이아웃별 설정 필요 |
| 스캔 문서 | OCR 도구 추가 | 언어팩과 인식 품질 검수 |
| PDF 생성 | 별도 생성 라이브러리 | pdfplumber는 생성 도구가 아님 |
두 라이브러리는 경쟁 관계라기보다 역할이 다릅니다. 예를 들어 pypdf로 필요한 페이지만 분리한 뒤 pdfplumber로 표를 추출하는 파이프라인을 만들 수 있습니다.
텍스트와 표 추출하기
pypdf 텍스트 추출
from pathlib import Path
from pypdf import PdfReader
source = Path("report.pdf")
reader = PdfReader(source)
pages = []
for number, page in enumerate(reader.pages, start=1):
text = page.extract_text() or ""
pages.append(f"[페이지 {number}]\n{text}")
Path("report.txt").write_text("\n\n".join(pages), encoding="utf-8")
extract_text() 결과가 None일 수 있어 빈 문자열 처리가 필요합니다. PDF는 글자를 문단이 아니라 좌표에 배치하는 형식이므로, 추출된 줄 순서나 공백이 사람이 보는 화면과 같다고 보장할 수 없습니다.
pdfplumber 표 추출
import pdfplumber
with pdfplumber.open("table-report.pdf") as pdf:
for page_no, page in enumerate(pdf.pages, start=1):
table = page.extract_table()
if not table:
continue
header, *rows = table
print(page_no, header, rows[:2])
pdfplumber는 기계적으로 생성된 PDF에서 가장 잘 동작한다고 공식 README에서 안내합니다. 선이 있는 표, 공백 정렬 표, 병합 셀 표는 서로 다른 설정이 필요할 수 있습니다. 첫 페이지에서 맞는 설정이 다른 페이지에서도 맞는지 표본 검수하세요.
PDF 병합과 분할 자동화
여러 파일 병합
from pathlib import Path
from pypdf import PdfWriter
writer = PdfWriter()
for path in sorted(Path("input").glob("*.pdf")):
writer.append(str(path))
with Path("merged.pdf").open("wb") as output:
writer.write(output)
writer.close()
파일명 문자열 정렬은 1, 10, 2 순서가 될 수 있습니다. 페이지 순서가 중요한 업무에서는 입력 목록을 명시하거나 숫자를 해석하는 정렬 키를 만드세요. 결과 파일을 입력 폴더에 두면 다음 실행에서 다시 합쳐질 수 있으므로 출력 폴더를 분리하는 것이 안전합니다.
페이지별 분할
from pathlib import Path
from pypdf import PdfReader, PdfWriter
reader = PdfReader("source.pdf")
out_dir = Path("split")
out_dir.mkdir(exist_ok=True)
for index, page in enumerate(reader.pages, start=1):
writer = PdfWriter()
writer.add_page(page)
with (out_dir / f"page-{index:03d}.pdf").open("wb") as output:
writer.write(output)
writer.close()
사람이 말하는 1페이지는 파이썬 인덱스 0이라는 점을 주의하세요. 예를 들어 3~5페이지만 추출할 때는 일반적으로 reader.pages[2:5] 범위를 사용합니다.
스캔 PDF는 OCR이 필요합니다
페이지에서 마우스로 글자를 선택할 수 없고 extract_text()가 빈 결과를 반환한다면 문서가 이미지로만 구성됐을 가능성이 큽니다. 이 경우 먼저 PDF 페이지를 이미지로 변환하고 Tesseract 같은 OCR 엔진이나 클라우드 문서 인식 서비스를 이용해 문자층을 만들어야 합니다.
OCR 결과에는 숫자, 표 경계, 비슷한 글자 오인식이 생길 수 있습니다. 계약서·금액·개인정보처럼 오류 비용이 큰 문서는 사람이 원본과 대조해야 하며, 외부 서비스에 업로드하기 전 보안 규정과 개인정보 처리 조건을 확인하세요.
암호화 PDF 처리
from pypdf import PdfReader
reader = PdfReader("protected.pdf")
if reader.is_encrypted:
result = reader.decrypt("user-password")
if result == 0:
raise ValueError("PDF 비밀번호를 확인하세요")
본인에게 처리 권한이 있는 문서에서만 암호를 사용해야 합니다. 암호를 코드에 직접 적지 말고 환경 변수나 비밀 관리 도구를 사용하세요.
실수 방지 체크리스트
- 입력 파일이 실제 PDF인지 헤더와 열기 결과를 확인합니다.
- 원본과 출력 폴더를 분리하고 원본을 덮어쓰지 않습니다.
- 암호화 여부와 처리 권한을 확인합니다.
- 스캔 PDF인지 텍스트 PDF인지 표본 페이지로 판단합니다.
- 페이지 번호의 0 기반 인덱스를 확인합니다.
- 병합 순서를 파일명 정렬에만 맡기지 않습니다.
- 추출 결과의 페이지 수, 행 수, 금액 합계를 원본과 대조합니다.
- 개인정보 문서를 외부 OCR 서비스에 무단 전송하지 않습니다.
자주 묻는 질문
1. PyPDF2와 pypdf는 같은가요?
현재 사용 예제는 pypdf 패키지와 최신 공식 문서를 기준으로 확인하는 것이 안전합니다.
2. pdfplumber로 PDF를 수정할 수 있나요?
주요 목적은 추출과 분석입니다. 페이지 조작은 pypdf, 생성은 별도 도구를 검토하세요.
3. 한글 텍스트도 추출되나요?
PDF에 올바른 문자 매핑과 텍스트층이 있으면 가능하지만 폰트 인코딩에 따라 깨질 수 있습니다.
4. 표가 한 줄로 합쳐집니다.
선과 문자 간격 구조가 문서마다 달라 표 설정을 조정해야 합니다. 시각적 디버깅으로 경계를 확인하세요.
5. 스캔 PDF에서 빈 문자열이 나옵니다.
이미지에는 텍스트층이 없으므로 OCR이 필요합니다.
6. 병합하면 북마크가 유지되나요?
병합 방식과 원본 구조에 따라 달라질 수 있으므로 공식 API 옵션을 확인하고 결과를 검수하세요.
7. 특정 페이지만 추출하려면?
PdfReader.pages에서 원하는 범위를 골라 PdfWriter에 추가합니다.
8. 큰 PDF가 메모리를 많이 씁니다.
페이지 단위 처리, 중간 파일 분리와 입력 크기 제한을 검토하고 운영 환경에서 실제 측정하세요.
9. PDF에서 이미지를 추출할 수 있나요?
pypdf에 관련 기능이 있지만 PDF 내부 이미지 형식과 마스크 구조에 따라 결과가 달라집니다.
10. 자동화 결과를 어떻게 검증하나요?
페이지 수, 파일 크기, 첫·중간·마지막 페이지, 추출 행 수와 핵심 값의 표본을 자동·수동으로 함께 확인하세요.
공식 출처
공식 문서 확인일: 2026년 9월 5일. PDF 구조와 라이브러리 버전에 따라 추출 결과가 달라질 수 있으므로 실제 문서 표본으로 검증하세요.