엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기

이미지
엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기 (완성 코드 공개) "매크로가 포함된 파일을 다른 사람에게 보내면 보안 경고 때문에 매크로 사용 설정을 매번 따로 해야 한다", "VBA 코드가 회사 PC마다 다르게 작동해서 디버깅이 어렵다", "매크로를 쓰는 동료가 퇴사하면 그 파일을 아무도 수정하지 못한다"… VBA 매크로는 엑셀 안에서 바로 실행되는 장점이 있지만, 보안 정책으로 차단되거나, 회사 PC마다 설정이 달라 오작동하거나, 코드 관리가 어려운 한계가 있습니다. 이 글에서는 이 블로그에서 지금까지 소개한 파이썬 코드들이 VBA의 어떤 기능을 대체할 수 있는지 비교하고, 대표적인 매크로 작업을 파이썬으로 구현하는 방법을 소개합니다. VBA 매크로 vs 파이썬 비교 VBA 매크로 파이썬 실행 환경 엑셀 안에서만 동작 독립적으로 어디서나 동작 보안 경고 매번 발생, 차단 가능 해당 없음 배포 파일에 코드 포함 스크립트 파일만 공유 디버깅 엑셀 VBA 편집기 사용 다양한 코드 에디터 사용 가능 다른 프로그램 연동 제한적 (Win API 필요) 매우 풍부함 (이메일, 웹, DB 등) 버전 관리(깃 등) 거의 불가능 일반적인 코드처럼 관리 가능 배우는 난이도 엑셀에 특화된 문법 범용 프로그래밍 언어, 활용도 넓음 💡 언제 VBA가 더 나을까: 엑셀을 열자마자 버튼 클릭으로 즉시 실행하고 싶거나, 엑셀 전용 UI(사용자 정의 양식)가 필요한 경우는 VBA가 더 간단할 수 있습니다. 하지만 안정성, 보안, 확장성을 고려하면 대부분의 반복 작업은 파이썬이 더 유리합니다. 대표 매크로 작업 1 — 여러 시트 합치기 VBA로 흔히 작성하는 "모...

PDF 신청서 양식 손으로 채우지 마세요! 파이썬으로 자동 작성하기

PDF 신청서 양식 손으로 채우지 마세요! 파이썬으로 자동 작성하기 (완성 코드 공개)

파이썬으로 PDF 양식의 입력란을 자동으로 채우는 모습


"거래처 30곳에 보낼 신청서 PDF를 거래처명만 다르게 일일이 입력해야 한다", "정부 지원사업 신청서 양식이 PDF인데 같은 정보를 반복 입력해야 한다", "직원들의 휴가신청서를 매번 손으로 작성하고 있다"…

입력 가능한 PDF 양식(폼 필드가 있는 PDF)은 Adobe Acrobat에서 클릭해서 채우는 방식이 일반적이지만, 여러 개를 반복 작성해야 한다면 자동화가 훨씬 효율적입니다. 파이썬을 사용하면 PDF 양식의 입력란을 자동으로 채우고, 엑셀 목록을 기반으로 여러 개를 한꺼번에 생성할 수 있습니다.


1단계: 준비물 설치

파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.

PDF 양식 처리에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:

pip install pypdf pandas openpyxl

pypdf는 PDF 안의 입력 가능한 폼 필드(텍스트 입력란, 체크박스 등)를 읽고 값을 채우는 기능을 지원합니다. pandasopenpyxl은 엑셀 목록을 읽어 여러 신청서를 한꺼번에 생성하는 데 사용합니다.

⚠️ 중요한 전제조건: 이 방법은 PDF가 "입력 가능한 양식"(AcroForm)으로 만들어져 있을 때만 작동합니다. 그냥 스캔한 이미지 PDF나 텍스트만 있는 일반 PDF는 입력란이 없어 이 방법을 사용할 수 없습니다. PDF를 열었을 때 클릭하면 텍스트를 입력할 수 있는 칸이 있는지 먼저 확인하세요.

2단계: PDF의 입력란 이름 확인하기

PDF 양식을 채우려면 먼저 각 입력란의 내부 이름(필드명)을 알아야 합니다. 아래 코드로 확인할 수 있습니다.

from pypdf import PdfReader

PDF_PATH = r"C:\Users\내이름\Desktop\신청서_양식.pdf"   # ← 확인할 PDF 경로

reader = PdfReader(PDF_PATH)
fields = reader.get_fields()

if fields:
    print(f"  ✔ 발견된 입력란: {len(fields)}개\n")
    for field_name, field_info in fields.items():
        field_type = field_info.get("/FT", "알수없음")
        print(f"  필드명: '{field_name}'  (유형: {field_type})")
else:
    print("  ⚠ 입력 가능한 필드가 없습니다. 이 PDF는 일반 PDF이거나 스캔본입니다.")

실행하면 PDF 안에 어떤 입력란이 있고 그 이름이 무엇인지 출력됩니다. 이 이름들을 다음 단계 코드에서 그대로 사용합니다.


3단계: 완성 코드 — 단일 PDF 양식 채우기

아래 코드를 그대로 복사해서 메모장에 붙여넣고, fill_pdf.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.

from pypdf import PdfReader, PdfWriter
from datetime import datetime

# ① 설정
TEMPLATE_PATH = r"C:\Users\내이름\Desktop\신청서_양식.pdf"   # ← 원본 양식 PDF
OUTPUT_PATH   = r"C:\Users\내이름\Desktop\신청서_작성완료.pdf"  # ← 저장 경로

# ② 채울 내용 (2단계에서 확인한 필드명을 정확히 입력)
FIELD_VALUES = {
    "신청인_이름":  "홍길동",
    "신청일자":    datetime.now().strftime("%Y년 %m월 %d일"),
    "연락처":      "010-1234-5678",
    "신청내용":    "사무용품 구매 신청",
    "금액":        "150,000원",
}

# ③ PDF 읽기 및 양식 채우기
reader = PdfReader(TEMPLATE_PATH)
writer = PdfWriter()
writer.append(reader)

# 모든 페이지의 입력란에 값 채우기
for page in writer.pages:
    writer.update_page_form_field_values(page, FIELD_VALUES)

print(f"  ✔ {len(FIELD_VALUES)}개 필드 입력 완료")

# ④ 저장
with open(OUTPUT_PATH, "wb") as f:
    writer.write(f)

print(f"\n✅ 완료! 작성된 PDF 저장 → {OUTPUT_PATH}")

4단계: 완성 코드 — 엑셀 목록으로 여러 신청서 한꺼번에 생성

거래처마다 다른 신청서를 한꺼번에 만드는 코드입니다. 아래 코드를 bulk_fill_pdf.py로 저장하세요.

from pypdf import PdfReader, PdfWriter
import pandas as pd
from pathlib import Path

# ① 설정
TEMPLATE_PATH = r"C:\Users\내이름\Desktop\신청서_양식.pdf"
EXCEL_PATH    = r"C:\Users\내이름\Desktop\신청자목록.xlsx"   # ← 신청자 정보 엑셀
OUTPUT_DIR    = r"C:\Users\내이름\Desktop\신청서모음"

output_dir = Path(OUTPUT_DIR)
output_dir.mkdir(exist_ok=True)

# ② 엑셀 읽기 (열 이름은 PDF 필드명과 일치시키는 것을 권장)
df = pd.read_excel(EXCEL_PATH, engine="openpyxl")
print(f"  ✔ 신청자 목록 로드: {len(df)}건")

# ③ 각 행마다 PDF 생성
success = 0
for _, row in df.iterrows():
    field_values = {
        "신청인_이름": str(row["이름"]),
        "신청일자":   str(row["신청일자"]),
        "연락처":     str(row["연락처"]),
        "신청내용":   str(row["신청내용"]),
        "금액":       f"{int(row['금액']):,}원",
    }

    reader = PdfReader(TEMPLATE_PATH)
    writer = PdfWriter()
    writer.append(reader)

    for page in writer.pages:
        writer.update_page_form_field_values(page, field_values)

    out_path = output_dir / f"신청서_{row['이름']}.pdf"
    with open(out_path, "wb") as f:
        writer.write(f)

    print(f"  ✔ {out_path.name} 생성 완료")
    success += 1

print(f"\n✅ 완료! 총 {success}개 신청서 생성 → {OUTPUT_DIR}")

5단계: 실행 방법

  1. 2단계 코드로 PDF 양식의 실제 필드명을 먼저 확인합니다.
  2. 단일 양식 작성은 fill_pdf.pyFIELD_VALUES를 확인된 필드명에 맞게 수정 후 실행합니다.
  3. 여러 개를 만들 때는 bulk_fill_pdf.pyEXCEL_PATH를 설정하고 실행합니다.
python fill_pdf.py

정상 실행 시 터미널에 이렇게 출력됩니다:

  ✔ 5개 필드 입력 완료

✅ 완료! 작성된 PDF 저장 → C:\Users\내이름\Desktop\신청서_작성완료.pdf

6단계: 자주 발생하는 오류와 해결법

오류 1: PDF를 열어도 입력한 값이 보이지 않음

일부 PDF 뷰어(특히 윈도우 기본 뷰어)는 값이 채워졌어도 화면에 즉시 반영하지 않는 경우가 있습니다. Adobe Acrobat Reader나 크롬 브라우저로 열어서 확인하세요.

오류 2: KeyError 또는 필드가 채워지지 않음

FIELD_VALUES의 키 이름이 2단계에서 확인한 실제 필드명과 정확히 일치하지 않는 경우입니다. 대소문자, 공백까지 정확히 일치해야 합니다. 2단계 코드를 다시 실행해서 정확한 이름을 복사하세요.

오류 3: 체크박스나 라디오 버튼이 채워지지 않음

체크박스는 텍스트가 아니라 "/Yes" 또는 "/On" 같은 특수 값으로 채워야 하는 경우가 많습니다. 2단계 코드의 출력에서 해당 필드의 유형/Btn으로 나온다면, 값으로 "/Yes"를 입력해보세요.


응용: 채운 양식을 읽기 전용으로 고정하기

작성 완료된 신청서를 더 이상 수정할 수 없게 고정하려면 아래 코드를 저장 전에 추가합니다.

writer.set_need_appearances_writer(True)

# 모든 필드를 읽기 전용으로 설정
for page in writer.pages:
    if "/Annots" in page:
        for annot in page["/Annots"]:
            annot_obj = annot.get_object()
            annot_obj[NameObject("/Ff")] = NumberObject(1)   # 읽기 전용 플래그
💡 이전 게시글과 결합하면: PDF 도장 자동 삽입 편과 결합하면 양식 작성 후 자동으로 도장까지 찍을 수 있고, 이메일 자동 발송 편과 결합하면 완성된 신청서를 자동으로 발송할 수 있습니다.

핵심 요약

  • 전제조건: PDF가 입력 가능한 양식(AcroForm)이어야 함
  • 준비물: Python + pypdf + pandas + openpyxl 설치 (pip install pypdf pandas openpyxl)
  • 필드명 확인: get_fields()로 PDF의 실제 입력란 이름 확인 (필수 선행 작업)
  • 단일 작성: FIELD_VALUES 설정 후 fill_pdf.py 실행
  • 대량 작성: 엑셀 목록 기반으로 bulk_fill_pdf.py 실행

이 코드를 응용하면 체크박스·라디오버튼이 포함된 복잡한 양식도 처리하거나, 채운 PDF에 서명 이미지를 함께 삽입하는 것도 가능합니다.

이 블로그의 인기 게시물

느려진 구글 크롬 속도 2배 빨라지는 3가지 설정 방법 (2026년 최신 가이드)

카카오톡 용량 줄이기! 대화방 파일 삭제로 스마트폰 용량 확보법 (1분 해결)

업무 속도 3배 빨라지는 윈도우 기본 캡처 도구 단축키 및 200% 활용 꿀팁