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

Every value 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 가져오기입니다. 그래서 회계 프로그램 쪽의 버전이나 요금제에 덜 의존하고, 열 매핑만 맞추면 그대로 들어갑니다.
월말에 쌓인 영수증을 촬영 → 1시트 → 1개의 CSV → 프로그램에 일괄 가져오기. 수기로 입력하던 시간이, 확인하는 시간으로 바뀝니다.
이미지가 아니라 스캔 PDF가 손에 있다면 스캔 PDF를 Excel로 변환하는 방법도 함께 보세요. 청구서·납품서를 API로 자동 처리하고 싶다면 청구서·납품서 OCR API 글이 참고가 됩니다.
PDF 영수증도 그대로 다룰 수 있다
메일로 온 영수증이 PDF라서 복사도 안 된다 ── 이것도 흔히 막히는 지점입니다. 앱에 PDF를 드롭하면 각 페이지가 자동으로 이미지화된 뒤 OCR에 걸립니다. 그래서 「PDF는 복사 불가」라는 벽을, 이쪽에서 의식할 필요가 없습니다. 여러 페이지의 PDF는 페이지별로 처리되어, 결과적으로 시트에 쌓입니다.
요금은 투명하게, 실패하면 과금되지 않는다
- 1장 ¥10의 종량 과금(call/image 단위).
- 실패 시 무과금 ── 결과가 나오지 않은 이미지에는 과금되지 않고, 엔진 오류는 자동으로 환불됩니다.
- 무료 한도는 월 100장(신용카드 불필요, 매월 리셋).
- 정액으로 쓴다면 Pro $39/월.
「일단 이번 달 영수증을 시험해 보고 싶다」면, 무료 한도 범위에서 그대로 돌릴 수 있습니다.
영수증·청구서의 전자화는 인보이스 제도나 전자장부보존법(電子帳簿保存法)에 맞춘 운영 만들기 실무에서 도움이 됩니다. 원본의 어디에서 읽은 값인지를 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 / 머니포워드(マネーフォワード) / 야요이(弥生)에 그대로 가져올 수 있습니다.