영수증 OCR로 CSV 변환해서 회계 프로그램에 가져오기
영수증 수기 입력, Excel 한글 깨짐, 품목이 한 셀에 뭉개짐, PDF는 복사조차 안 됨 ── 그 월말 작업을 '촬영→열 정의→1장=1행→CSV 출력→freee/머니포워드/야요이에 CSV 가져오기'로 바꾸는 실무 가이드. 품목은 배열 열로 상품 1개=1행 전개, UTF-8 BOM으로 깨짐 방지, 값마다 bbox+match_ratio로 원본 대조. 1장 ₩100·실패 시 무과금·무료 100장/월.
월말. 지갑이나 서랍에서 쏟아져 나온 영수증 더미. 이걸 한 장씩 회계 프로그램에 직접 입력해 넣는, 그 작업을 떠올려 보세요. 가게 이름을 치고, 날짜를 치고, 합계를 치고, 또 다음 한 장으로. 30장쯤 되면 집중력은 끊기고, 자릿수를 하나 잘못 쳐도 알아채지 못합니다. "영수증 수기 입력"이 지옥인 건 양이 많아서가 아니라 "단순한데 틀리면 안 된다"는 성질 때문입니다.
스캔해서 Excel에 붙여 넣으려고 하면, 이번엔 또 다른 벽이 옵니다. CSV를 열면 한글이 깨집니다. 영수증 품목(산 상품 목록)이 줄바꿈마다 뭉개져 한 셀에 들어가 버립니다. PDF로 온 영수증은 복사조차 안 됩니다. 결국 화면 옆에 원본을 늘어놓고, 눈으로 짚어가며 다시 입력 ── 이래서는 무엇을 위한 디지털화인지 알 수 없습니다.
이 글은 그 작업을 "영수증을 찍는다 → 열을 한 번만 정한다 → 업로드하면 1장=1행 → CSV로 내보내 freee / 머니포워드 / 야요이에 가져온다" 라는 흐름으로 바꾸기 위한 실무 가이드입니다. 제품 설명서가 아니라, 월말의 그 더미를 어떻게 치우느냐는 이야기로 읽어 주세요.
일단 한번 만져보기 (업로드 불필요·10초)
아래 샘플은 실제 영수증 2장을 OCR에 돌린 결과입니다. 각 필드(가게 이름·날짜·합계·품목)에 커서를 올리면, 그 값을 이미지의 어디에서 읽어냈는지가 원본 위에 하이라이트됩니다. 업로드도 로그인도 필요 없습니다. 우선 "읽어낸 값이 원본의 바로 그 자리를 제대로 가리키고 있는지"부터 확인해 보세요.

Each value with a box carries a verified on-page location — bbox + 4-point vertices + match_ratio — on a 0–1000 normalized grid (0,0 top-left → 1000,1000 bottom-right), the same shape the live API returns. Hover a field to trace it back to the pixels it came from.
영수증 OCR에서 CSV까지, 실제 4단계
할 일은 많지 않습니다. 순서대로 동영상으로 살펴봅니다.
- 원본 이미지를 업로드 ── 촬영하거나 스캔한 영수증을, 미리 정해 둔 열(가게 이름·날짜·합계·품목…)에 흘려 넣습니다.
- 추출 시트에서 확인 ── 1장이 1행이 되고, 열이 자동으로 채워집니다.
- bbox로 원본 대조 ── 의심스러운 값은 셀을 클릭하면 원본의 해당 위치가 빛나서, 눈으로 바로 확인.
- CSV로 내보내기 ── 그대로 회계 프로그램에 가져올 수 있는 CSV로 출력.
먼저 1단계, 촬영/스캔한 영수증을 업로드하면 각 이미지가 정의한 열에 맞춰 구조화됩니다.
열(스키마)은 한 번만 정하면 된다
핵심은 열을 처음에 한 번만 정해 두는 것입니다. "가게 이름·지점명·날짜·합계·품목"처럼 원하는 항목을 정의해 두면, 그 뒤로 업로드한 영수증은 모두 같은 형태(같은 스키마)로 1행에 정리됩니다. 레이아웃이 가게마다 제각각이어도 나오는 행의 형태는 똑같습니다. 그렇기에 마지막에 한 장의 CSV로 묶을 수 있습니다.
"품목이 한 셀에 뭉개진다"는 문제의 정체
수작업으로 Excel을 채울 때 가장 괴로운 것이 영수증의 품목(산 상품 목록)입니다. 영수증 한 장에 상품이 10줄 있으면, 그걸 한 셀에 욱여넣거나 손으로 10줄로 쪼개는 수밖에 없습니다.
space-ocr에서는 품목을 배열(array) 타입의 열로 정의합니다. CSV로 내보낼 때 이 배열 열은 품목.상품명 품목.단가 품목.수량처럼 자식 필드로 전개되어, 상품 1개=1행으로 세로로 펼쳐집니다. 즉 "한 셀에 뭉개지는" 게 아니라, 처음부터 회계나 집계에 바로 쓸 수 있는 행의 형태로 나옵니다.
{
"columns": [
{ "name": "店舗名", "type": "string" },
{ "name": "支店名", "type": "string" },
{ "name": "日付", "type": "string" },
{ "name": "合計", "type": "string" },
{
"name": "明細",
"type": "array",
"children": [
{ "name": "商品名", "type": "string" },
{ "name": "単価", "type": "string" },
{ "name": "数量", "type": "string" }
]
}
]
}의심스러운 값은 클릭해서 원본으로 날아가 확인한다
읽어낸 값을 전부 그대로 믿을 필요는 없습니다. 신경 쓰이는 셀을 클릭하면, 원본 이미지에서 "바로 그 값을 읽어낸" 위치가 하이라이트됩니다. 시선이 단숨에 그 자리로 향하니, 한 더미를 훑는 점검이 빠릅니다.
이게 가능한 건, 값마다 읽어낸 위치(bbox)와 일치도(match_ratio)가 함께 돌아오기 때문입니다. 값이 이미지의 어디에서 왔는지를 사람도 시스템도 나중에 되짚어 볼 수 있다 ── 즉 감사가 가능하다는 뜻입니다.
좌표는 AI가 "여기쯤 있었을 것"이라고 답한 숫자가 아닙니다. 언어 모델이 돌려주는 것은 값의 텍스트와, 참조한 단어 토큰의 힌트(wid)뿐입니다. 좌표 자체는 만들어 내지 않습니다. 엔진은 먼저 그 값의 텍스트를 Vision OCR이 실제로 페이지에서 검출한 문자(심볼)와 한 글자씩 대조한 뒤, 찾아낸 실제 픽셀 위치에 박스를 놓습니다. 그런 다음 값마다 match_ratio(일치도·0~1.0)를 붙입니다. 1.0은 모든 글자가 원본에서 발견됐다는 뜻이고, 0.85 이상을 확신 매치로 봅니다. 언어 모델의 토큰 힌트는 찾아낸 토큰의 위치를 보조적으로 덮어쓰는 데 쓰기도 하지만, 곧이곧대로 믿지는 않습니다 ── 특히 같은 값이 줄줄이 늘어선 열에서는 힌트가 흔들리기 쉬워서, 열의 묶임이나 행의 정합성으로 점검하고, 어긋나면 문자 대조 결과로 되돌립니다. 좌표는 xmin / ymin / xmax / ymax의 0~1000 정규화 그리드(0,0=좌상단, 1000,1000=우하단)로 돌아오므로 이미지 해상도에 좌우되지 않습니다. 요컨대 "AI가 틀리지 않는다"가 아니라, "모든 값을 원본에 비춰 보고, 얼마나 일치했는지를 숫자로 보여 준다"는 것입니다.
CSV로 내보내, 회계 프로그램에 가져온다
확인이 끝나면 시트를 CSV로 내보냅니다. 헤더는 스칼라 열+배열의 자식 열(품목.상품명처럼 전개)로 구성되고, 품목은 상품 1개=1행으로 세로 전개됩니다. 손으로 고친 셀이 있으면 그 수정값이 우선됩니다.
그리고 깨짐 방지. 출력 CSV는 UTF-8 BOM 포함이라 Excel에서 열어도 한글이 깨지지 않습니다. 이것이 "Excel에서 글자 깨짐"을 애초에 일으키지 않는 이유입니다.
freee / 머니포워드 / 야요이로 가져오기
내보낸 CSV는 각 회계 프로그램의 "CSV 가져오기(임포트)" 기능으로 불러옵니다. 공식 API 연동이 아니라 범용 CSV 가져오기입니다. 그래서 회계 프로그램 쪽의 버전이나 요금제에 덜 얽매이고, 열 매핑만 맞추면 그대로 들어갑니다.
월말에 쌓인 영수증을 촬영 → 시트 한 장 → CSV 한 개 → 프로그램에 한꺼번에 가져오기. 수기로 입력하던 시간이 확인하는 시간으로 바뀝니다.
이미지가 아니라 스캔 PDF가 손에 있다면 스캔 PDF를 Excel로 변환하는 방법도 함께 보세요. 청구서·납품서를 API로 자동 처리하고 싶다면 청구서·납품서 OCR API 글이 도움이 됩니다.
PDF 영수증도 그대로 다룰 수 있다
메일로 온 영수증이 PDF라서 복사조차 안 된다 ── 이것도 흔히 막히는 지점입니다. 앱에 PDF를 드롭하면 각 페이지가 자동으로 이미지로 변환된 뒤 OCR을 거칩니다. 그래서 "PDF는 복사 불가"라는 벽을 사용자가 신경 쓸 필요가 없습니다. 여러 페이지짜리 PDF는 페이지별로 처리되어 시트에 차곡차곡 쌓입니다.
요금은 투명하게, 실패하면 과금되지 않는다
- 1장 ₩100의 종량 과금(call/image 단위).
- 실패 시 무과금 ── 결과가 나오지 않은 이미지에는 과금되지 않고, 엔진 오류는 자동으로 환불됩니다.
- 무료 한도는 월 100장(신용카드 불필요, 매월 리셋).
- 정액으로 쓴다면 Pro ₩49,800/월.
"일단 이번 달 영수증부터 시험해 보고 싶다"면, 무료 한도 안에서 그대로 돌려 볼 수 있습니다.
영수증·청구서의 전자화는 인보이스 제도나 전자장부보존법(電子帳簿保存法)에 맞춰 업무 체계를 갖추는 실무에 도움이 됩니다. 원본의 어디에서 읽은 값인지를 match_ratio와 함께 나중에 되짚어 볼 수 있다는 점은 사내 점검과 확인을 한결 수월하게 해 줍니다. 다만 이 글은 회계·법무 자문이 아니며, 법적 요건의 충족이나 인증을 보장하지 않습니다. 제도 대응의 최종 판단은 반드시 고문 세무사 등 전문가에게 확인하시기 바랍니다.
월말의 영수증을, 찍기만 하면 끝나게
- 열(스키마)을 한 번만 정의한다가게 이름·지점명·날짜·합계에 더해, 품목은 배열(array) 타입의 열로 두고 "상품명·단가·수량"을 자식 필드로 정의합니다. 이렇게 해 두면 이후의 모든 영수증이 같은 형태로 1행에 정리됩니다.
- 영수증을 촬영·스캔해서 업로드한다스마트폰 촬영이든 스캔이든 상관없습니다. PDF는 드롭하면 각 페이지가 자동으로 이미지화된 뒤 OCR됩니다. 1장=1행으로 읽어내지고, 열이 자동으로 채워집니다.
- 의심스러운 값을 원본에서 확인한다셀을 클릭하면 원본 이미지에서 그 값을 읽어낸 위치(bbox)가 하이라이트됩니다. match_ratio가 0.85 미만인 값은 일치가 약하다는 신호이므로 우선적으로 확인·수정합니다. 손으로 고친 값은 원래의 OCR 값과 분리해서 저장됩니다.
- CSV로 내보낸다시트를 CSV로 내보냅니다. 품목 같은 배열 열은 "품목.상품명"처럼 전개되어 상품 1개=1행으로 세로로 펼쳐집니다. 출력은 UTF-8 BOM 포함이라 Excel에서 열어도 한글이 깨지지 않습니다.
- 회계 프로그램의 CSV 가져오기로 가져온다freee·머니포워드·야요이 등의 "CSV 가져오기(임포트)" 기능으로 불러옵니다. 공식 API 연동이 아니라 범용 CSV 가져오기이므로, 열 매핑만 맞추면 그대로 가져올 수 있습니다.
일본어 영수증·레시트에 제대로 대응하나요?
PDF 영수증도 CSV로 변환할 수 있나요?
출력한 CSV는 freee나 머니포워드, 야요이에 그대로 가져올 수 있나요?
읽어내기 정확도는 어느 정도 신뢰할 수 있나요?
개인정보나 원본 데이터는 안전한가요? 읽어낸 값은 검증할 수 있나요?
영수증 수기 입력, 이번 달로 졸업하지 않으실래요
무료 한도는 월 100장·카드 불필요. 촬영해서 CSV로 내보내고, freee / 머니포워드 / 야요이에 그대로 가져올 수 있습니다.