PDF에 도장·서명 자동으로 찍기! 파이썬으로 텍스트·이미지 삽입하기
PDF에 도장·서명 자동으로 찍기! 파이썬으로 텍스트·이미지 삽입하기 (완성 코드 공개)
"승인된 계약서 30개에 회사 도장 이미지를 일일이 삽입해야 한다", "발송하는 견적서 PDF마다 발급 날짜와 페이지 번호를 넣어야 한다", "외부 공유용 PDF에 '대외비' 워터마크를 모든 페이지에 넣어야 한다"…
PDF 편집 프로그램으로 도장이나 텍스트를 한 장씩 삽입하는 작업은 문서 수가 많아질수록 시간이 오래 걸립니다. 파이썬을 한 번만 세팅해두면 PDF의 원하는 위치에 도장 이미지, 텍스트, 날짜, 페이지 번호, 워터마크를 자동으로 삽입하고 여러 파일을 한꺼번에 처리할 수 있습니다.
1단계: 준비물 설치
파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.
PDF 편집에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install pypdf reportlab
pypdf는 기존 PDF를 읽고 페이지를 합성하는 라이브러리이고, reportlab은 텍스트와 이미지가 담긴 새 PDF 레이어를 생성하는 라이브러리입니다. 두 라이브러리를 함께 사용해 기존 PDF 위에 도장이나 텍스트를 겹쳐 그리는 방식으로 작동합니다.
💡 이 코드로 할 수 있는 것: PDF의 지정한 좌표에 도장·서명 이미지 삽입, 모든 페이지 또는 특정 페이지에만 텍스트 삽입, 페이지 번호 자동 추가, 반투명 워터마크 전체 페이지 삽입, 폴더 안의 여러 PDF에 동시 적용까지 처리합니다.
2단계: 완성 코드 — 도장 이미지 삽입
아래 코드를 그대로 복사해서 메모장에 붙여넣고, pdf_stamp.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
from pypdf import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from io import BytesIO
from pathlib import Path
from datetime import datetime
# ① 설정
INPUT_PDF = r"C:\Users\내이름\Desktop\계약서.pdf" # ← 원본 PDF 경로
STAMP_IMAGE = r"C:\Users\내이름\Desktop\도장.png" # ← 도장 이미지 경로 (투명 배경 PNG 권장)
OUTPUT_PDF = r"C:\Users\내이름\Desktop\계약서_도장완료.pdf" # ← 저장 경로
STAMP_X = 450 # ← 도장 위치 X좌표 (페이지 왼쪽 하단이 0,0)
STAMP_Y = 100 # ← 도장 위치 Y좌표
STAMP_SIZE = 80 # ← 도장 크기 (가로·세로, 픽셀)
TARGET_PAGE = -1 # ← 도장 찍을 페이지 (0부터 시작, -1은 마지막 페이지)
# ② 도장 레이어 생성
buffer = BytesIO()
c = canvas.Canvas(buffer, pagesize=A4)
c.drawImage(STAMP_IMAGE, STAMP_X, STAMP_Y,
width=STAMP_SIZE, height=STAMP_SIZE, mask="auto")
c.save()
buffer.seek(0)
stamp_pdf = PdfReader(buffer)
stamp_page = stamp_pdf.pages[0]
# ③ 원본 PDF에 도장 합성
reader = PdfReader(INPUT_PDF)
writer = PdfWriter()
total_pages = len(reader.pages)
target = total_pages - 1 if TARGET_PAGE == -1 else TARGET_PAGE
for i, page in enumerate(reader.pages):
if i == target:
page.merge_page(stamp_page) # 도장 레이어를 원본 페이지에 합성
print(f" ✔ {i+1}페이지에 도장 삽입 완료")
writer.add_page(page)
# ④ 저장
with open(OUTPUT_PDF, "wb") as f:
writer.write(f)
print(f"\n✅ 완료! 도장 삽입 → {OUTPUT_PDF}")
3단계: 완성 코드 — 모든 페이지에 워터마크·페이지번호 삽입
모든 페이지에 워터마크와 페이지 번호를 동시에 넣는 코드입니다. 아래 코드를 pdf_watermark.py로 저장하세요.
from pypdf import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.colors import Color
from io import BytesIO
# ① 설정
INPUT_PDF = r"C:\Users\내이름\Desktop\보고서.pdf"
OUTPUT_PDF = r"C:\Users\내이름\Desktop\보고서_워터마크.pdf"
WATERMARK_TEXT = "대외비" # ← 워터마크 문구
ADD_PAGE_NUM = True # ← True: 페이지 번호 추가
reader = PdfReader(INPUT_PDF)
writer = PdfWriter()
total = len(reader.pages)
for i, page in enumerate(reader.pages):
# ② 페이지마다 레이어 생성 (워터마크 + 페이지번호)
buffer = BytesIO()
c = canvas.Canvas(buffer, pagesize=A4)
# 워터마크: 대각선 반투명 텍스트
c.saveState()
c.translate(300, 400)
c.rotate(45)
c.setFillColor(Color(0.7, 0.7, 0.7, alpha=0.3)) # 회색 30% 투명도
c.setFont("Helvetica-Bold", 60)
c.drawCentredString(0, 0, WATERMARK_TEXT)
c.restoreState()
# 페이지 번호: 하단 중앙
if ADD_PAGE_NUM:
c.setFillColor(Color(0, 0, 0, alpha=1))
c.setFont("Helvetica", 10)
c.drawCentredString(300, 30, f"- {i+1} / {total} -")
c.save()
buffer.seek(0)
overlay_page = PdfReader(buffer).pages[0]
page.merge_page(overlay_page)
writer.add_page(page)
print(f" ✔ {i+1}/{total} 페이지 처리 완료")
with open(OUTPUT_PDF, "wb") as f:
writer.write(f)
print(f"\n✅ 완료! 워터마크·페이지번호 삽입 → {OUTPUT_PDF}")
4단계: 실행 방법
도장 삽입:
- 코드 ① 설정의
INPUT_PDF,STAMP_IMAGE,OUTPUT_PDF경로를 입력합니다. STAMP_X,STAMP_Y로 도장 위치를 조정합니다. 처음 실행 후 결과 PDF를 열어 위치를 확인하고 좌표를 미세 조정하세요.- 터미널에서 실행합니다:
python pdf_stamp.py
정상 실행 시 터미널에 이렇게 출력됩니다:
✔ 3페이지에 도장 삽입 완료 ✅ 완료! 도장 삽입 → C:\Users\내이름\Desktop\계약서_도장완료.pdf
5단계: 자주 발생하는 오류와 해결법
오류 1: 도장이 엉뚱한 위치에 삽입됨
PDF 좌표 시스템은 왼쪽 하단이 (0,0)입니다. A4 크기는 약 595×842포인트입니다. STAMP_X, STAMP_Y 값을 조정하며 결과를 확인하세요. 우측 하단에 찍으려면 X는 400 이상, Y는 100 이하로 설정합니다.
오류 2: 도장 이미지에 배경색이 같이 찍힘
도장 이미지가 투명 배경(PNG)이 아닌 경우입니다. mask="auto" 옵션이 적용되어 있어도 원본 이미지 자체가 흰 배경 JPG라면 배경이 그대로 찍힙니다. 투명 배경 PNG 도장 이미지를 사용하세요.
오류 3: ModuleNotFoundError: No module named 'reportlab'
설치가 제대로 되지 않은 경우입니다. 아래 명령어로 다시 시도하세요.
python -m pip install pypdf reportlab
응용: 폴더 안의 여러 PDF에 한꺼번에 도장 찍기
여러 계약서에 동시에 도장을 찍어야 할 때 유용합니다. 코드 ① 설정과 ③ 합성 부분을 아래처럼 바꾸면 됩니다.
FOLDER_PATH = r"C:\Users\내이름\Desktop\계약서모음"
OUTPUT_DIR = r"C:\Users\내이름\Desktop\도장완료"
from pathlib import Path
output_dir = Path(OUTPUT_DIR)
output_dir.mkdir(exist_ok=True)
for pdf_file in Path(FOLDER_PATH).glob("*.pdf"):
reader = PdfReader(str(pdf_file))
writer = PdfWriter()
target = len(reader.pages) - 1
for i, page in enumerate(reader.pages):
if i == target:
page.merge_page(stamp_page)
writer.add_page(page)
out_path = output_dir / pdf_file.name
with open(out_path, "wb") as f:
writer.write(f)
print(f" ✔ {pdf_file.name} 도장 삽입 완료")
💡 이전 게시글과 결합하면: PDF 자동 병합 편으로 여러 문서를 합친 뒤 이 코드로 도장을 찍거나, 이메일 자동 발송 편과 결합해 도장이 찍힌 최종 PDF를 자동으로 발송할 수 있습니다.
핵심 요약
- 준비물: Python + pypdf + reportlab 설치 (pip install pypdf reportlab)
- 도장 삽입: STAMP_IMAGE, STAMP_X, STAMP_Y, TARGET_PAGE 설정 후 실행
- 워터마크: WATERMARK_TEXT 설정 후 모든 페이지에 자동 적용
- 결과: 도장·텍스트·페이지번호가 합성된 PDF 자동 생성, 폴더 단위 일괄 처리 가능
이 코드를 응용하면 페이지마다 다른 텍스트를 넣거나, QR코드를 PDF에 자동 삽입하는 것도 가능합니다.
