AI 활용

학교 프린트물을 OCR로 읽어 캘린더와 리마인더에 자동 등록하는 구조

학교 프린트물을 OCR로 읽어 캘린더와 리마인더에 자동 등록하는 구조

Photo: freestocks.org (CC0 1.0) via Flickr

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

학교에서 배부되는 프린트물은 지금도 종이가 중심입니다. 행사 일정, 제출물 마감일, 준비물. 정보의 종류도 많아서 깜빡 놓치면 나중에 곤란해집니다.

그래서 프린트물을 OCR로 읽어, 내용별로 캘린더와 리마인더에 자동으로 나눠 등록하는 구조를 만들었습니다. 이번에는 API 호출 실제 예시까지 포함해서 구체적으로 소개합니다.

계기는 “본 기억은 있는데 내용을 잊는다”는 것

프린트물은 한 번 훑어보면 그 순간에는 기억한 것 같은 기분이 듭니다. 다만 일주일 후에는 내용을 잊어버립니다. 냉장고에 붙여둔 채 마감일을 넘겨버린 적도 있었습니다.

“보는” 것과 “잊지 않고 실행하는” 것은 다른 이야기입니다. 그래서 본 내용을 구조 안에 담아내는 부분을 자동화하기로 했습니다.

구조의 흐름

하고 있는 일은 다음 3단계입니다.

  1. 프린트물을 스캔하고 OCR로 텍스트 데이터로 변환한다(2단 구성 레이아웃에도 대응)
  2. 내용을 “행사”인지 “할 일(제출물·마감일)“인지 분류한다
  3. 분류 결과를 각각에 맞는 앱에 API를 통해 자동 등록한다

행사는 캘린더로, 할 일은 리마인더로. 역할별로 보관 위치를 나누고 있는 것이 포인트입니다.

OCR 부분의 노하우

학교 프린트물은 A4 2단 구성 레이아웃이 많아서, 그대로 OCR에 넣으면 줄 중간에서 좌우 문장이 섞여버리는 경우가 있습니다. 그래서 먼저 이미지를 좌우 두 개로 나눈 다음 각각 별도로 OCR에 넘기고 있습니다.

from PIL import Image

def split_two_columns(image_path):
    img = Image.open(image_path)
    width, height = img.size
    left = img.crop((0, 0, width // 2, height))
    right = img.crop((width // 2, 0, width, height))
    return left, right

이 분할만으로 인식 정확도가 꽤 개선되었습니다. 만약 읽어들인 결과를 보고도 여전히 좌우 문장이 섞여 있다면, 2분할이 아니라 3분할로 하거나, 제목 위치를 힌트로 자르는 범위를 조정하는 식으로 대응하고 있습니다. 읽어들인 결과는 텍스트 데이터만이 아니라 반드시 원본 프린트 이미지와도 비교해서 확인합니다. 표나 줄은 OCR로 깨지기 쉽고, 특히 날짜와 요일의 조합을 잘못 읽으면 캘린더 등록에서 치명적인 실수로 이어지기 때문입니다.

분류 규칙

행사와 할 일을 구별하는 기준을 다음과 같이 정리하고 있습니다.

종류판단 기준등록처색 구분
행사(참가 필요)보호자의 참가가 필요한 일정캘린더빨강
마감일·납부제출물이나 집금의 기한캘린더+리마인더주황
준비물·준비전날까지 준비할 것리마인더없음
매일의 준비물필통·공책 등 일상적인 것등록하지 않음-

분류가 애매한 항목은 원칙적으로 “양쪽에 등록하는 쪽이 낫다”는 방침으로 하고 있습니다. 나중에 불필요하면 지울 수 있지만, 등록하지 않으면 놓친 채로 모르게 되기 때문입니다.

이 구조는 결국 스마트폰 안에서 동작합니다. 캘린더도 리마인더도 알림이 도착하는 곳은 제 스마트폰입니다. 구조를 지탱하는 기반으로서 요금제도 한 번 재검토해도 좋지 않을까요.

가입하지 않아도 100포인트를 받는 요금 시뮬레이션 스마트폰 요금제도 구조의 기반으로 재검토하기

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

캘린더 등록 실제 예시

행사는 구글 캘린더의 API로 등록하고 있습니다. 색 구분에는 colorId라는 파라미터를 써서, 참가 필수인 행사는 빨강(colorId: "11"), 마감일 계열은 주황(colorId: "6")을 지정하고 있습니다.

title: "◯◯초등학교: 운동회"
start.date: "2026-05-23"
end.date: "2026-05-24"   # 종일 이벤트는 end를 다음 날로 한다
description: "프린트 해당 부분 요약"
colorId: "11"  # 보호자 참가가 필요하므로 빨강

colorId는 숫자가 아니라 문자열로 전달해야 하며, 여기를 숫자형으로 전달하면 API 오류가 되므로 주의하고 있습니다. 시각이 정해진 행사(보호자 모임 14시부터 등)는 종일 이벤트가 아니라 시작·종료 시각을 지정해서 등록합니다.

등록 전에는 같은 제목·같은 날짜의 이벤트가 이미 존재하지 않는지 확인하고 있습니다. 학년 소식지와 다른 배부물 양쪽에 같은 행사가 적혀 있는 경우가 있어서, 확인을 건너뛰면 같은 일정이 중복 등록되기 때문입니다.

리마인더·작업 앱 등록과, 일부러 하는 이중 등록

마감일이나 준비물은 작업 관리 앱과 리마인더 앱 양쪽에 같은 제목으로 등록하고 있습니다. 겉보기엔 중복이지만 의도적으로 그렇게 하고 있습니다.

python3 things_bridge_client.py add \
  --title "◯◯초등학교: 서예 세트 주문 (4/17까지)" \
  --when "2026-04-17" \
  --tags "학교,아이,돈" \
  --notes "카드 결제. 신청서의 QR에서."

작업 관리 앱은 체크리스트로 구조화해서 관리하는 데 적합합니다. 반면 리마인더 앱은 음성 어시스턴트를 통해서나 기본 알림으로도 문득 눈에 들어오기 쉬운 특성이 있습니다. 도구별로 잘하는 분야가 다르므로 일부러 중복시키고 있습니다.

같은 내용을 한 곳에만 등록하면 그 앱을 열지 않은 날은 정보 자체가 없는 것과 같아집니다. 이중으로 가지고 있음으로써 놓칠 위험을 줄이고 있습니다. 다만 이중 등록으로 인한 노이즈를 피하기 위해, 리마인더 쪽에 등록하기 전에는 기존 목록을 가져와서 같은 이름의 것이 이미 없는지 반드시 확인합니다.

리마인더의 기존 목록을 확인한다(중복 방지)
→ 같은 이름의 리마인더가 없으면 작업 관리 앱과 같은 제목·같은 기한으로 신규 등록한다

제목을 한 글자도 다르지 않게 맞춰두면 나중에 양쪽을 대조해서 확인하고 싶을 때도 찾기 쉬워집니다.

날짜의 연도가 생략되는 문제

학교 프린트물은 “4월 15일(수)“처럼 연도가 생략되는 경우가 대부분입니다. 현재 학년도에서 연도를 보충해서 등록해야 하는데, 3월에 배부된 프린트에 “4월”이라고 쓰여 있다면 다음 학년도의 4월을 가리킬 가능성을 반드시 검토합니다.

또한 요일을 덧붙이는 처리를 할 때는 반드시 날짜로부터 요일을 계산해서 기계적으로 조합하도록 하고 있습니다. 사람의 손이나 기억으로 요일을 맞추면 쉽게 틀리기 때문입니다.

해보고 느낀 점

가장 도움이 된 것은 “봤는데 잊어버린다”가 없어진 것입니다. 읽어들인 시점에 캘린더나 리마인더에 반영되므로 이후는 알림에 따르기만 하면 됩니다.

다만 OCR의 정확도가 완벽한 것은 아닙니다. 특히 손글씨 보충 사항이 들어간 프린트물은 읽기 어려운 경우가 있습니다. 그런 경우는 무리하게 자동화를 거치지 않고 직접 눈으로 확인한 다음 등록하도록 하고 있습니다.

이런 분에게 추천합니다

정리

프린트물의 내용을 “행사”와 “할 일”로 분류해서, 각각 적합한 곳에 자동 등록하는 구조를 만들었습니다. 색 구분이나 이중 등록, 중복 확인 같은 소소한 규칙을 정해두는 것만으로 정보 처리가 꽤 정리되었다고 느낍니다.

종이 정보를 어떻게 구조에 담아낼지는 소소하지만 효과가 큰 노하우라고 생각합니다.

결국 알림을 받는 곳은 언제나 제 스마트폰입니다. 구조를 오래 쓸수록 통신 환경의 비중도 올라갑니다. 요금제도 한 번 점검해두면 손해는 아닐 것입니다.

가입하지 않아도 100포인트를 받는 요금 시뮬레이션 알림을 지탱하는 스마트폰 회선을 재검토해보기

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

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

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

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

ABOUT THE AUTHOR
まさきん

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

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

프로필 보기

관련 글

RELATED
Grok을 쓰고 싶어서 X Premium에 가입했더니, 테슬라에서도 쓸 수 있게 되어 있던 이야기 AI 활용

Grok을 쓰고 싶어서 X Premium에 가입했더니, 테슬라에서도 쓸 수 있게 되어 있던 이야기

Grok을 쓰고 싶어서 X의 유료 플랜에 가입했습니다. 그런데 마침 같은 시기에 테슬라 차 안에서도 같은 Grok을 쓸 수 있게 되어 있어서 놀랐습니다. 요금 플랜을 고르는 법부터 차 안에서 쓰는 법까지, 직접 확인한 내용을 정리합니다.

2026.09.01 · 읽는 시간 약 3분
말로 전해지는 가족 일정을 AI로 손쉽게 구글 캘린더에 등록하는 방법 AI 활용

말로 전해지는 가족 일정을 AI로 손쉽게 구글 캘린더에 등록하는 방법

가족 라인이나 대화로 들은 "다음 달 운동회는 10/25 9시부터" 같은 일정을, AI에게 말만 하면 구글 캘린더 등록용 링크로 만들어주는 방법을 소개합니다. 스캔이나 앱 설치도 필요 없습니다.

2026.07.10 · 읽는 시간 약 5분
아침 준비 중에 AI에게 한 장의 '오늘의 브리핑'을 만들게 하는 이야기 AI 활용

아침 준비 중에 AI에게 한 장의 '오늘의 브리핑'을 만들게 하는 이야기

일정·메일·채팅을 AI에게 정리시켜, 아침 준비를 하면서 볼 수 있는 한 장의 브리핑을 자동 생성하는 구조를 만들었습니다. 정보를 모으는 방법부터 화면 디자인까지, 그대로 따라할 수 있는 형태로 소개합니다.

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