AI 활용

입력할 수 없는 PDF 신청서에 글자를 넣는 방법. 기입란이 없는 용지에 AI가 좌표로 겹쳐 찍게 한 7가지 순서

입력할 수 없는 PDF 신청서에 글자를 넣는 방법. 기입란이 없는 용지에 AI가 좌표로 겹쳐 찍게 한 7가지 순서

안녕하세요, まさきん입니다.

건강보험 급여 신청서를 만들려고 했더니 PDF에 글자를 입력할 수 없었습니다. 기입란이 없는, 이른바 평평한 PDF입니다. AI에게 좌표로 글자를 겹쳐 찍게 해서 인쇄용으로 완성했기에, 그 흐름을 메모해 둡니다.

※ 글 공개 시점의 정보입니다. 최신 조건은 공식 사이트에서 확인해 주세요.

POINT
  • 입력할 수 없는 PDF 신청서는 기입란(AcroForm)을 갖지 않은 “평평한 PDF”인 경우가 많다
  • 도구는 3가지. pdfplumber로 괘선의 좌표를 줍고, reportlab으로 글자를 그린다. 겹치는 것은 pypdf
  • 좌표의 원점은 pdfplumber가 왼쪽 위, reportlab이 왼쪽 아래. 위아래가 반대라서 변환이 필요하다
  • A4는 약 595×842pt 크기다. 1pt는 1/72인치이고, 좌표는 모두 이 단위로 생각한다
  • 계좌번호·자필 서명·날인의 3곳은 겹쳐 찍지 않고, 인쇄한 뒤 손으로 썼다

기입란이 없는 PDF를 만났다

만든 것은 건강보험 급여 신청서입니다. 먼저 대신 낸 의료비를 환급받기 위한 서류죠. 제도의 흐름은 대신 낸 의료비를 요양비와 의료비 지원으로 돌려받는 순서에 써 두었습니다.

신청서는 PDF로 배포되고 있었습니다. 다만 열어도 칸을 클릭할 수 없습니다. 글자를 칠 곳이 어디에도 없는 상태입니다. 용지는 2장이었습니다.

인쇄해서 전부 손으로 쓰는 방법도 있습니다. 그렇다고 해도 같은 숫자나 기간을 여러 곳에 쓰는 것은 조금 번거롭습니다. 잘못 쓰면 다시 인쇄해야 합니다. 그래서 칠 수 있는 부분만 AI에게 치게 하기로 했습니다.

평평한 PDF를 구별하는 방법

PDF 신청서에는 2종류가 있습니다. 입력란이 심어져 있는 것과, 그저 그림으로서 괘선이 그려져 있는 것입니다.

Adobe 공식 도움말에서는 후자를 “flat form”이라고 부르고 있습니다. 작성자가 입력란을 붙이지 않은 폼이라는 설명이었습니다. 이 글에서는 평평한 PDF라고 부르기로 합니다.

구별하는 방법은 간단합니다.

세 번째는 pypdf라는 라이브러리로 확인할 수 있습니다. 공식 문서에 있는 get_fields()를 호출하기만 하면 됩니다. 입력란이 없으면 None이 돌아옵니다.

from pypdf import PdfReader

reader = PdfReader("form.pdf")
print(reader.get_fields())  # 입력란이 없으면 None

제 신청서는 여기서 입력란이 없다는 것을 알았습니다. 입력란이 있는 PDF라면 이 글의 방법은 필요 없습니다. 평범하게 칸에 입력하는 쪽이 확실합니다.

쓰는 도구는 3가지

AI에게 쓰게 한 도구는 모두 무료 Python 라이브러리입니다. 역할이 깔끔하게 나뉘어 있습니다.

도구역할이 작업에서 쓰는 기능
pdfplumber원본 PDF를 읽는다괘선이나 사각형의 좌표를 얻는다. 페이지를 이미지로 만든다
reportlab새 PDF를 그린다투명한 종이에 글자만 놓는다
pypdfPDF끼리 겹친다입력란 유무를 조사한다. 글자 종이를 용지에 겹친다

떠올리면 되는 것은 투명 시트입니다. 신청서 위에 투명 시트를 놓습니다. 거기에 글자만 인쇄해서 2장을 맞붙인다. 하는 일은 그것뿐입니다.

원본 PDF 자체는 고쳐 쓰지 않습니다. 그래서 어긋나면 투명 시트만 다시 만들면 됩니다. 이 점이 마음 편한 부분이라고 느꼈습니다.

PDF의 단위는 포인트

좌표의 단위는 포인트(pt)입니다. reportlab 공식 문서에는 1pt가 1/72인치라고 적혀 있습니다.

A4는 210mm×297mm입니다. 포인트로 고치면 약 595×842pt 가 됩니다. 제 환경에서 reportlab의 A4 상수를 표시해 보니 595.28×841.89였습니다.

즉 1mm는 약 2.83pt입니다. 칸의 높이가 8mm라면 대략 23pt. 이 환산을 머리에 두면 AI가 내놓은 숫자를 가늠할 수 있습니다.

순서의 전체 그림

흐름은 7단계입니다. 엔지니어가 아니어도 순서만 따라갈 수 있으면 충분하다고 생각합니다.

  1. PDF에 입력란이 있는지 확인한다
  2. 괘선의 좌표를 꺼낸다
  3. 글자를 놓을 셀의 사각형을 정한다
  4. 글자만 실은 겹쳐 찍기용 PDF를 만든다
  5. 원본 PDF에 겹친다
  6. 이미지로 만들어 눈으로 확인한다
  7. 인쇄해서 손으로 쓸 부분을 쓴다

제가 한 것은 AI 에이전트에 대한 지시와 확인입니다. 코드는 직접 쓰지 않았습니다. 다만 무엇을 하고 있는지는 알아 두는 편이 좋다고 생각합니다. 어긋났을 때 어디를 의심하면 되는지 알 수 있기 때문입니다.

괘선의 좌표를 얻기

pdfplumber는 페이지 위의 도형을 목록으로 돌려줍니다. 공식 설명에서는 선이 .lines이고 사각형은 .rects입니다. 사각형을 4개의 변으로 풀어 선과 합친 .edges도 있습니다.

import pdfplumber

with pdfplumber.open("form.pdf") as pdf:
    page = pdf.pages[0]
    print(page.width, page.height)
    for r in page.rects:
        print(r["x0"], r["x1"], r["top"], r["bottom"])

x0은 왼쪽 끝, x1은 오른쪽 끝입니다. 둘 다 페이지 왼쪽 끝에서의 거리가 됩니다. top과 bottom은 페이지 위쪽 끝에서의 거리입니다.

신청서의 표는 사각형이 아니라 선의 모음으로 그려져 있는 경우도 있습니다. 그럴 때는 .lines나 .edges를 봅니다. 세로선과 가로선의 교차에서 셀의 사각형을 짜 맞춰 가는 방식입니다.

여기가 가장 수수하고 가장 중요한 공정이었습니다. 칸의 왼쪽 끝·오른쪽 끝·위쪽 끝·아래쪽 끝의 4가지 숫자가 정해지면 나머지는 기계적으로 진행됩니다.

겹쳐 찍기용 PDF 만들기

다음으로 reportlab으로 글자만 있는 PDF를 만듭니다. 일본어를 출력하려면 폰트 등록이 필요합니다. 공식 문서에 실려 있는 것은 UnicodeCIDFont를 쓰는 방법입니다. 일본어 서체는 2가지가 올라와 있습니다. 명조체인 HeiseiMin-W3와 고딕체인 HeiseiKakuGo-W5입니다.

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont

pdfmetrics.registerFont(UnicodeCIDFont("HeiseiKakuGo-W5"))
c = canvas.Canvas("overlay.pdf", pagesize=A4)
c.setFont("HeiseiKakuGo-W5", 10)

H = A4[1]                  # 페이지 높이
x0, x1, bottom = 100, 300, 142   # pdfplumber로 얻은 값
y = H - bottom + 6         # 위아래를 뒤집고 조금 띄운다
c.drawString(x0 + 4, y, "Sample Name")       # 왼쪽 정렬
c.drawRightString(x1 - 4, y, "12,345")   # 오른쪽 정렬
c.showPage()               # 2번째 장이 있으면 이어서 그린다
c.save()

이름과 숫자는 물론 견본입니다. 포인트는 H - bottom 한 줄이죠. 위에서의 거리를 아래에서의 거리로 고치고 있습니다. 이유는 뒤의 장에서 쓰겠습니다.

특정 서체를 PDF에 심고 싶을 때는 TTFont도 쓸 수 있습니다. 가지고 있는 폰트 파일을 지정해서 등록하는 방법입니다. 인쇄 결과의 겉보기를 맞추고 싶다면 이쪽을 고르는 것도 방법일지 모릅니다.

원본 PDF에 겹쳐 이미지로 확인하기

마지막으로 pypdf로 두 개를 겹칩니다. 공식 문서에서는 “스탬프”로 소개되어 있는 merge_page()입니다.

from pypdf import PdfReader, PdfWriter

overlay = PdfReader("overlay.pdf")
writer = PdfWriter(clone_from="form.pdf")
for i, page in enumerate(writer.pages):
    page.merge_page(overlay.pages[i])
writer.write("filled.pdf")

merge_page()는 아무것도 지정하지 않으면 위에 겹치는 동작입니다. over=False를 붙이면 아래에 까는 형태가 됩니다. 이번에는 글자를 위에 올리고 싶으니 그대로 괜찮습니다.

만들어진 PDF는 바로 인쇄하지 않습니다. 먼저 이미지로 만들어 봅니다. pdfplumber의 to_image(resolution=150)으로 페이지를 PNG로 만들 수 있습니다. 칸에서 삐져나오지 않았는지를 여기서 모든 칸에 대해 봅니다.

고정비 재검토도 하는 일은 비슷합니다. 숫자를 내서 눈으로 확인하고 어긋난 곳을 고친다. 통신비도 그 순서로 보면 진행하기 쉽다고 생각합니다.

가입하지 않아도 100포인트를 받는 요금 시뮬레이션 스마트폰 요금도 숫자로 확인하면서 라쿠텐 모바일로 재검토하기

누르면 라쿠텐 로그인 페이지가 열립니다. 로그인하면 캠페인 내용이 표시됩니다.

좌표계는 위아래가 반대

이 작업에서 가장 틀리기 쉬운 것이 좌표의 방향입니다. 공식 문서에서 확인한 내용을 표로 만들었습니다.

항목pdfplumberreportlab
원점페이지의 왼쪽 위페이지의 왼쪽 아래
가로 방향x0 x1은 왼쪽 끝에서의 거리x는 오른쪽으로 갈수록 커진다
세로 방향top bottom은 위쪽 끝에서의 거리y는 위로 갈수록 커진다
단위포인트포인트(1/72인치)
변환그대로 읽는다y = 페이지 높이 − 위에서의 거리

pdfplumber에는 y0와 y1이라는 값도 있습니다. 이쪽은 페이지 아래쪽 끝에서의 거리입니다. 그래서 y0를 쓰면 뺄셈 없이 reportlab에 넘길 수 있습니다.

다만 top과 y0를 섞으면 혼란스러워집니다. 어느 쪽을 쓸지 처음에 정하고 AI에게도 전해 두는 것이 좋을 것 같습니다. 예를 들어 “위에서의 거리로 읽고, 그릴 때 뒤집는다”고 정해 버리는 식입니다.

주의
  • 글자가 용지의 위아래 반대쪽에 나왔다면 좌표 뒤집기를 잊었을 가능성이 높다
  • 가로 방향은 둘 다 왼쪽 끝이 기준이므로 그대로 쓸 수 있다
  • 용지 높이는 고정값으로 박아 두지 말고, 원본 PDF에서 읽은 값을 쓰면 안심

한 번 어긋난 원인은 오른쪽 끝을 잘못 읽은 것

사실 한 번 글자가 어긋났습니다. 원인은 어느 기입란의 오른쪽 끝 좌표입니다. AI가 올바른 위치보다 오른쪽에 있다고 읽고 있었습니다.

셀의 사각형은 글자를 놓는 기준이 됩니다. 오른쪽 끝의 숫자가 다르면 거기를 기준으로 한 글자도 움직입니다. 이런 어긋남은 겹친 결과를 이미지로 보면 바로 알 수 있습니다.

고치는 방법은 단순합니다. 괘선의 좌표를 다시 한번 읽어서 셀의 오른쪽 끝을 올바른 값으로 바꿨습니다. 그런 다음 겹쳐 찍기용 PDF를 다시 만들었습니다.

일반론으로 신청서의 표는 선이 복잡하게 얽혀 있습니다. 옆 칸의 선이나 바깥 테두리 선을 목적하는 칸의 끝으로 잘못 아는 일은 일어날 수 있습니다. 그래서 좌표는 “얻으면 끝”이 아닙니다. 이미지로 확인하는 공정과 세트라고 생각합니다.

손글씨로 남긴 3곳

전부를 겹쳐 찍은 것은 아닙니다. 다음 3곳은 일부러 비워 두었습니다.

칸겹쳐 찍기이유
이름·기간·금액 등의 칸했다잘못 친 것을 화면에서 고칠 수 있다
계좌번호하지 않았다파일에 남기고 싶지 않다
자필 서명하지 않았다본인이 쓰는 칸이니까
날인하지 않았다인쇄한 뒤에 찍는 것이니까

자필 서명 칸은 본인이 자기 손으로 쓰는 것이 일반적인 사고방식입니다. 인쇄한 이름은 자필 서명을 대신할 수 없습니다. 날인도 마찬가지로 종이에 인쇄한 뒤에 찍습니다.

계좌번호는 규칙이라기보다 제 판단입니다. AI에게 넘기는 데이터에도, 만든 PDF에도 남기고 싶지 않았습니다. 숫자가 적어서 손으로 써도 부담은 작네요.

또 하나 판단한 것이 있습니다. 개봉 금지로 봉해진 서류는 열지 않고 동봉하고, 해당 칸에는 “동봉한 서류와 같음”이라고 썼습니다.

CHECK
  • 인쇄해도 되는 칸과 자필 서명이 필요한 칸은 신청처의 기재 요령으로 확인한다
  • 망설여지면 신청처에 물어본 뒤에 인쇄한다
  • 정정 방법도 신청처의 규정에 따른다

기입값은 원본과 대조한다

AI에게 맡기면 위치 맞추기에 정신이 팔리기 쉽습니다. 다만 신청서에서 정말 중요한 것은 내용의 숫자 쪽입니다.

저는 기입한 값을 영수증과 명세서의 스캔본에 비춰 봤습니다. 금액과 기간이 일치하는지를 하나씩 확인했습니다. 여기는 사람의 눈으로 보는 공정으로 남겼습니다.

대조의 사고방식은 부업 경비를 회계 SaaS와 메일로 AI에게 대조시키는 이야기와 같습니다. 출처가 2개 있으면 맞대어 본다. 신청서에서도 다르지 않습니다.

종이를 한꺼번에 스캔하는 준비는 학습지 일괄 스캔과 분류 글도 참고가 될지 모릅니다.

개인정보의 취급

신청서에는 개인정보가 가득 들어 있습니다. AI에게 작업을 시킬 때는 넘기는 범위를 먼저 정해 두는 것이 좋다고 생각합니다.

특히 마지막은 잊기 쉬운 부분입니다. 확인용 이미지에는 기입이 끝난 내용이 그대로 찍혀 있습니다. 작업 폴더에 남겨 둔 채로 두지 않는 편이 안심이죠.

이 글에서도 건강보험의 이름이나 금액은 쓰지 않았습니다. 체험을 쓸 때도 넘기는 데이터를 좁힐 때도 사고방식은 같다고 생각합니다.

코드를 쓰지 않는 방법도 있다

여기까지 읽고 “거기까지는 안 한다”고 느낀 분도 있을지 모릅니다. 그 경우에는 Adobe Acrobat의 “입력 및 서명”이 후보가 됩니다.

Adobe 공식 도움말에는 평평한 폼에 입력하는 방법이 실려 있습니다. Acrobat Reader의 Fill & Sign 도구를 쓰는 방법입니다. 폼의 원하는 위치에 글자나 기호를 놓을 수 있습니다. 마우스로 자리를 정하므로 좌표를 생각할 필요가 없습니다.

용지가 1~2장이고 쓸 칸도 적다. 그렇다면 이쪽이 빠르다고 생각합니다. AI에게 좌표로 치게 하는 방법이 효과를 내는 것은 칸이 많을 때입니다. 같은 양식을 여러 번 만들 때도 맞지 않을까요.

맞는 사람·맞지 않는 사람

맞는 것은 다음과 같은 사람이라고 생각합니다.

반면 맞지 않는 것은 이런 경우입니다.

AI에게 맡겨도 확인은 사람의 일로 남습니다. 거기를 생략할 거라면 손으로 쓰는 쪽이 안전할지도 모릅니다.

자주 묻는 질문

Q. 입력할 수 없는 PDF인지는 어떻게 구별하나요?

칸을 클릭했을 때 커서가 나오지 않으면 입력란이 없는 PDF일 가능성이 높습니다. 확실한 것은 pypdf의 get_fields()로 조사하는 방법이죠. 입력란이 없으면 None이 돌아옵니다.

Q. 프로그래밍을 못해도 쓸 수 있나요?

코드는 AI 에이전트에게 쓰게 한다는 전제입니다. 저도 직접 쓰지 않았습니다. 다만 이미지로의 확인과 원본과의 대조는 스스로 할 필요가 있습니다.

Q. 글자가 위아래 반대 위치에 나오는 이유는 무엇인가요?

좌표의 원점이 다르기 때문입니다. pdfplumber는 왼쪽 위, reportlab은 왼쪽 아래가 원점입니다. 페이지 높이에서 위에서의 거리를 빼면 올바른 위치가 됩니다.

Q. 일본어가 깨지거나 나오지 않습니다.

일본어 폰트를 등록하지 않았을 가능성이 있습니다. reportlab에서는 UnicodeCIDFont로 일본어 서체를 등록할 수 있습니다. 가지고 있는 폰트를 쓴다면 TTFont입니다.

Q. 스캔한 종이 신청서에도 같은 방법을 쓸 수 있나요?

스캔한 PDF는 페이지 전체가 한 장의 이미지로 되어 있는 경우가 많습니다. 그 경우에는 괘선이 도형으로 들어 있지 않으므로 pdfplumber로는 좌표를 주울 수 없습니다. 이미지에서 칸의 위치를 재는 다른 궁리가 필요하다고 생각합니다.

Q. 자필 서명 칸이나 날인 칸도 인쇄해도 되나요?

자필 서명 칸은 본인이 손으로 쓴다는 것이 일반적인 사고방식입니다. 날인도 인쇄한 뒤에 합니다. 세세한 취급은 신청처에 따라 다르므로 기재 요령을 확인해 보세요.

Q. 인쇄했더니 위치가 어긋났습니다.

인쇄할 때의 확대·축소가 원인일지도 모릅니다. 용지에 맞춰 축소하는 설정이면 전체가 조금 작아집니다. 이번에는 원본 용지와 글자를 하나의 PDF로 겹쳤으므로 괘선과 글자는 함께 움직입니다. 배율은 실제 크기로 해 두면 안심입니다.

Q. 원본 PDF는 고쳐 써지나요?

고쳐 써지지 않습니다. 원본 PDF를 읽어 들여 겹친 결과를 다른 이름으로 저장하고 있습니다. 어긋나면 겹쳐 찍기용 PDF만 다시 만들면 됩니다.

참고한 공식 정보

정리

기입란이 없는 PDF라도 괘선의 좌표만 얻을 수 있으면 글자는 겹칠 수 있습니다. 걸려 넘어진 것은 좌표를 잘못 읽은 것이었습니다. 다시 읽으면 고쳐지므로 이미지로 확인하는 공정은 생략하지 않는 편이 좋을 것 같습니다.

신청서는 우편으로 냈습니다. 칠 수 있는 곳은 치고, 손으로 써야 할 곳은 손으로 쓴다. 그 선 긋기를 먼저 정해 두면 작업이 차분해지지 않을까요.

절차의 수고를 줄일 수 있으면 가계의 다른 재검토에도 조금 손이 갑니다. 통신비 같은 매달의 고정비도 그 흐름에서 한번 봐 두면 좋을지 모릅니다.

가입하지 않아도 100포인트를 받는 요금 시뮬레이션 절차를 밟는 김에 라쿠텐 모바일로 스마트폰 요금도 재검토해 보기

누르면 라쿠텐 로그인 페이지가 열립니다. 로그인하면 캠페인 내용이 표시됩니다.

이 글에는 제휴 광고가 포함되어 있습니다. 이 사이트의 링크를 통해 상품·서비스에 신청하시면 제휴사로부터 보상을 받을 수 있습니다. 또한 운영자는 라쿠텐 그룹 소속 직원으로, 사원 추천 프로그램을 통해 보상을 받는 경우가 있습니다. 기사 내용과 평가는 광고 유무와 관계없이 운영자의 실제 경험과 조사를 바탕으로 작성했지만, 위 관계를 이해하신 후 읽어 주시기 바랍니다. 자세한 내용은 면책조항·제휴 링크 안내를 참고해 주세요. 면책조항·제휴 링크 안내

이 글에는 기계 번역이 포함되어 있습니다. 정확한 조건은 라쿠텐 모바일 공식 사이트의 다국어 페이지에서 확인해 주세요.

라쿠텐 모바일의 통신 지역·전파 상황이 궁금하신 분은, 공식 전파 개선·조사 요청 양식 을 통해 문의하실 수 있습니다.

ABOUT THE AUTHOR
まさきん

라쿠텐 그룹 근무·디지털 마케터(FP 자격 보유)

40대 초반, 맞벌이·네 자녀의 아빠. 라쿠텐 그룹에서 디지털 마케터로 근무하면서, 재무설계사(FP) 자격을 활용해 가계 관리와 자산 형성에도 힘쓰고 있다.

프로필 보기

관련 글

RELATED
Gemini(Google AI Pro) 패밀리 공유는 가족 5명까지. 설정 절차와 범위 AI 활용

Gemini(Google AI Pro) 패밀리 공유는 가족 5명까지. 설정 절차와 범위

Google AI Pro는 관리자 외에 가족 5명까지 공유할 수 있습니다. Gemini 앱과 저장용량은 공유되고 YouTube Premium Lite는 관리자만. Flow 한도는 가족이 나눠 씁니다. 설정 절차와 자녀 계정 처리를 공식 도움말로 정리했습니다.

2026.10.13 · 읽는 시간 약 13분
AI 구독 청구일과 가계부가 어긋나는 3가지 이유|Claude는 업그레이드하면 청구일이 바뀐다 AI 활용

AI 구독 청구일과 가계부가 어긋나는 3가지 이유|Claude는 업그레이드하면 청구일이 바뀐다

Claude는 월 중간에 Max로 올리면 청구 주기가 리셋되어 그날이 새로운 청구일이 됩니다. 달러 결제의 엔화 환산은 카드사에 데이터가 도착한 시점에 정해지고, 명세와 가계부 반영은 며칠 늦습니다. 영수증 메일을 기준으로 월을 정하는 5단계를 정리했습니다.

2026.10.13 · 읽는 시간 약 14분
freee 회계의 미처리 내역을 월 1회 대사 작업으로. 매월 5일 7:30·3구분·상한 15건으로 사람에게 넘기는 설계 AI 활용

freee 회계의 미처리 내역을 월 1회 대사 작업으로. 매월 5일 7:30·3구분·상한 15건으로 사람에게 넘기는 설계

freee 회계의 미처리 내역이 18건 정도, 주간 확인 6번 동안 움직이지 않은 채 남아 있었습니다. 매월 5일 아침 7:30에 집 Mac에서 돌리는 대사 작업의 설계와, 확정할 수 있는 분은 월 1건, 망설여지는 내역은 1건씩 상한 15건으로 사람에게 넘기는 기준을 정리합니다.

2026.10.12 · 읽는 시간 약 15분
라쿠텐 모바일로 전환 시 최대 14,000포인트 가입하지 않아도 100포인트를 받는 요금 시뮬레이션 →
지금 신청하기 →