스캔한 청구서를 AI로 엑셀 파일로 변환하고 항목별로 검증하는 방법
청구서의 앞자리 0을 보존하고 이월액과 소계를 중복 집계하지 않는 추출 방법입니다. 2페이지 샘플, 프롬프트, 실제 엑셀 결과와 대조 절차를 제공합니다.
스캔한 청구서를 업무에 쓸 수 있는 엑셀로 만들려면 항목과 원본 페이지를 함께 추출하고, 합계와 품목 행을 분리한 다음, 내려받은 파일의 수치를 대조해야 합니다. 파일이 정상적으로 열려도 품목 누락, SKU 변경, 소계의 중복 집계가 있을 수 있습니다.
이 글은 작성자가 만든 2페이지짜리 가상 청구서를 사용합니다. 품목은 6개이며 고객 정보는 없습니다. PDF 페이지는 텍스트 레이어가 없는 래스터 이미지이므로 OCR 없이 텍스트를 추출하면 아무것도 나오지 않습니다. 정답 데이터를 따로 제공해 그럴듯한 표를 신뢰하는 대신 직접 대조할 수 있습니다. 모든 청구서의 정확도를 입증하는 벤치마크가 아니라 연습용 예제입니다.
프롬프트를 보내기 전에 원본 받기
스캔 청구서 PDF를 받고 대조용 정답은 추출 요청에서 제외하세요. 둘을 함께 주면 청구서 읽기가 아니라 정답 복사를 시험하게 됩니다.
2페이지에는 표 머리글이 반복됩니다. 1페이지 끝의 이월액 USD 185.40은 2페이지에서 청구서 소계 앞에 다시 등장합니다. 어느 쪽도 일곱 번째 품목이 아닙니다. 모든 SKU에는 앞자리 0이 있습니다. 필기나 심한 스캔 결함이 없는 깨끗한 문서도 이런 평범한 구조 때문에 잘못 추출될 수 있습니다.
| 확인할 항목 | 이 예제의 정답 |
|---|---|
| 품목 행 수 | 6 |
| 1페이지 품목 소계 | USD 185.40 |
| 2페이지 품목 소계 | USD 104.59 |
| 청구서 소계 | USD 289.99 |
| 소계에서 한 번 반올림한 세금 | USD 29.00 |
| 최종 합계 | USD 318.99 |
예제의 세금 규칙은 원본에 적혀 있습니다. 다른 국가의 세무 처리나 공급업체 청구서를 임의의 규칙으로 다시 계산하라는 지침이 아닙니다. 실제 문서에는 항목별 반올림, 할인, 운임, 원천징수, 여러 세율이 있을 수 있습니다. 원본 값을 보존하고 차이를 조사하세요. 이 예제를 한국의 전자세금계산서와 같은 형식으로 간주해서는 안 됩니다.
실제 문서에 맞는 추출 경로 선택하기
PDF에서 문장을 선택해 자연스러운 텍스트를 복사할 수 있다면 사용 가능한 텍스트 레이어가 있을 가능성이 큽니다. 이미지 전체만 선택된다면 OCR이나 렌더링된 페이지를 읽는 모델이 필요합니다. 검색 가능한 PDF에도 부정확한 OCR 레이어가 있을 수 있으므로 SKU 하나와 금액 하나를 눈에 보이는 원본과 대조하세요.
청구서를 한 건씩 처리한다면 파일을 다루는 어시스턴트로 추출, 예외 기록, 엑셀 생성을 묶을 수 있습니다. 일정한 양식과 업무 규칙으로 수천 건을 처리한다면 유지 관리되는 문서 처리 파이프라인이 반복과 모니터링에 유리합니다. 모델 순위는 평가 대상을 고르는 출발점이지 개별 청구서의 정확성을 보장하는 증거가 아닙니다. OCR 모델 선택 가이드(영어)는 모델 선택을, 이 글은 최종 엑셀 검증을 다룹니다.
선택한 인터페이스가 실제로 PDF를 받고 다운로드 가능한 XLSX를 만드는지 확인하세요. 이미지를 받는 API가 PDF 업로드 엔드포인트인 것은 아닙니다. 채팅 안의 표도 엑셀 첨부 파일과 다릅니다. PDF는 안 되고 이미지만 지원한다면 각 페이지를 이미지로 내보내 원래 순서대로 제공하세요. 첫 업로드가 성공했다고 2페이지를 빠뜨려서는 안 됩니다.
요청 전에 통합 문서 구조 정의하기
인쇄된 품목 한 줄마다 행 하나를 만듭니다. 최소 열은 invoice_id, sku, description, quantity, unit_price, line_amount, currency, source_file, source_page, review_status입니다. 원본에 행 번호가 없으면 안정적인 행 식별자를 추가하세요. 같은 상품이 실제로 두 번 등장할 수 있으므로 SKU만으로 중복을 제거하지 마세요.
식별자는 텍스트, 수량과 금액은 숫자로 저장하고 통화는 따로 둡니다. 숫자 101을 서식으로 000101처럼 보이게 하는 것과 문자열 000101을 저장하는 것은 다릅니다. 화면상 맞아 보여도 CSV로 내보내면 앞자리 0이 사라질 수 있습니다.
InvoiceSummary에는 소계, 세금, 합계와 출처 위치를, Exceptions에는 읽기 어려운 필드, 계산 차이, 중복 의심 행을 기록합니다. 예외 시트가 비어 있다는 사실은 실제 검사를 했을 때만 의미가 있습니다. 단순히 ‘검증 완료’라고 쓰는 대신 무엇을 확인했는지 명시하게 하세요.
실행 가능한 추출 요청 보내기
Ofox Chat에서 연습용 새 대화를 열고 가상 청구서만 첨부합니다. 두 페이지가 모두 포함됐는지 확인한 뒤 요청하세요. 아래는 재사용 가능한 작업 명세이며, 실행 시점의 파일 지원과 생성된 첨부 파일은 별도로 확인해야 합니다. 원래 실험을 재현할 수 있도록 프롬프트는 영어 그대로 제공합니다.
Read the attached synthetic invoice PDF. Extract all printed item rows from
all pages into a downloadable XLSX. Do not browse or use external sources.
Create three sheets:
1. LineItems: invoice_id, sku, description, quantity, unit_price,
line_amount, currency, source_file, source_page, review_status.
2. InvoiceSummary: the printed subtotal, tax, total, tax/rounding wording,
and the source page for each value.
3. Exceptions: unreadable fields, inconsistent amounts and any rows that
require a person to check the image.
Preserve identifiers, including leading zeros, as text. Do not treat repeated
headers, carried-forward amounts, subtotals, tax or totals as item rows.
Do not deduplicate repeated SKUs unless the printed rows are proven duplicates.
For an unreadable value, leave the numeric cell empty and explain why.
Do not infer a missing number just to make the invoice balance.
Compare quantity × unit price with each printed line amount. Reconcile the
item sum with the printed subtotal and the subtotal plus printed tax with
the printed total. Preserve both printed and calculated values when they
conflict. State the page count and item count. Return the actual XLSX file,
not only a Markdown table. Keep the original PDF unchanged.
이 요청은 원문 읽기와 산술 검사를 분리합니다. 합계를 맞추려고 인쇄된 금액을 바꾸면 더 이상 충실한 추출 결과가 아닙니다. 모델이 의도된 값을 추측하더라도 불일치는 그대로 남겨야 합니다.
비공개 청구서는 처리 권한이 있는 정보만 담은 사본을 사용하세요. 불필요한 은행 정보나 개인정보는 제거합니다. 공개 튜토리얼의 합성 데이터 예제가 조직의 실제 공급업체 문서를 같은 서비스에 보내도 된다는 허가를 의미하지는 않습니다.
미리보기 대신 내려받은 셀 검증하기
통합 문서의 LineItems부터 확인합니다. 총 6행이며 원본 1페이지를 가리키는 행 3개, 2페이지를 가리키는 행 3개여야 합니다. 000101과 000108을 찾아 표시 서식뿐 아니라 저장된 셀 값이나 수식 입력줄을 확인하세요. 각 설명과 숫자를 해당 원본 페이지와 대조합니다.
금액도 독립적으로 계산합니다. 예제의 계산은 다음과 같습니다.
Page 1: 2 × 19.95 + 3 × 8.50 + 1 × 120.00 = 185.40
Page 2: 4 × 6.25 + 2 × 14.80 + 1 × 49.99 = 104.59
Subtotal: 185.40 + 104.59 = 289.99
Tax: 289.99 × 10%, rounded to cents = 29.00
Total: 289.99 + 29.00 = 318.99
합계가 같다는 것만으로 충분하지 않습니다. 두 오류가 서로 상쇄될 수 있고 SKU 오류는 금액을 바꾸지 않습니다. 각 행이 원본의 해당 품목과 일치하는지, 모든 페이지가 포함됐는지, 수치 관계가 맞는지를 따로 검증하세요. 여러 문서를 처리할 때는 청구서별·통화별로 대조한 뒤 집계합니다.
수식이 들어 있으면 Excel 등 호환 스프레드시트 앱에서 재계산하세요. Python으로 수식 캐시를 읽으면 값이 없거나 오래됐을 수 있습니다. openpyxl 문서(영어)는 수식 기록과 계산을 구분합니다. 자동 감사에서는 십진수 연산으로 기대값을 별도로 구하고, 수식 문자열 자체를 계산 결과로 취급하지 마세요.
실제 Chat 실행 결과
2026년 11월 7일 Ofox Chat의 Balanced 모드에 2페이지 가상 PDF만 올렸습니다. 정답 JSON은 제공하지 않았습니다. 결과로 LineItems, InvoiceSummary, Exceptions가 있는 실제 엑셀 파일을 받았습니다. 테스트와 인터페이스는 영어였으며, 이 한국어 글은 동일한 결과를 설명하는 번역본입니다. 별도의 한국어 문서 실험을 뜻하지 않습니다.

다운로드한 파일도 검사했습니다. 6개 SKU 모두 문자열이었고 설명과 숫자는 원본과 일치했으며, 페이지 열에는 각 페이지당 3행이 있었습니다. 독립적인 십진수 연산으로 소계 USD 289.99와 합계 USD 318.99를 재현했습니다. 이월액은 요약 시트에만 있고 품목으로 집계되지 않았습니다.
Exceptions는 완전히 빈 시트가 아니라 안내용 ‘No exceptions’ 행이 있습니다. 이를 실패 품목으로 세면 안 됩니다. 요약에는 인쇄된 값과 계산값이 따로 보존됩니다. 이 결과는 깨끗한 영어 합성 청구서에서 해당 절차가 작동했음을 보여줄 뿐, OCR 정확도나 필기, 손상된 스캔, 다른 언어, 여러 공급업체 문서의 성능을 입증하지 않습니다.
실패한 부분만 좁혀 수정하기
| 증상 | 먼저 조사할 부분 | 다음 조치 |
|---|---|---|
| 품목이 7~8개 | 이월액 또는 소계가 품목으로 들어감 | 원본 위치를 대조해 요약 행임이 확인된 것만 제거 |
| 합계는 맞지만 SKU가 틀림 | 텍스트 인식 또는 셀 형식 | 원본 이미지로 식별자를 고치고 텍스트로 유지 |
| 품목이 3개뿐 | 2페이지 누락 또는 부분 처리 | 2페이지를 다시 첨부하고 검증된 행과 출처 추가 |
| 수량 × 단가 불일치 | OCR, 할인, 단위 환산 또는 원본 오류 | 인쇄값을 보존하고 차이를 기록한 뒤 업무상 처리 결정 |
| 합계가 USD 504.39 | 1페이지 이월액 중복 집계 가능성 | 추가된 USD 185.40의 출처 확인; 무조건 빼지 않기 |
| 파일 링크 없음 | 파일 전달 실패 | XLSX 다운로드 요청; 미지원이면 텍스트 열을 보존하는 문서화된 CSV 가져오기 경로 사용 |
‘다시 해줘’보다 구체적인 수정 요청이 검증하기 쉽습니다. 아래는 가상의 오류 수정 예시이며 위 실제 테스트에서 발생한 오류를 뜻하지 않습니다.
Reopen the original invoice page 2. The carry-forward amount 185.40 is not
an item row. Remove that row from LineItems only if its source location
confirms it is the carry-forward. Preserve the six printed item rows,
SKUs and source pages. Recompute the reconciliation and export a new
workbook named invoice-reviewed-v2.xlsx. Describe exactly what changed.
수정 전후 파일을 모두 보관하세요. 원본이 흐리면 프롬프트를 바꿔도 해결되지 않을 수 있으므로 더 선명한 스캔이나 직접 확인이 필요합니다. 모델이 생성한 신뢰도 점수로 이 검사를 대신하지 마세요.
검증된 한 건을 반복 가능한 절차로 만들기
폴더 전체를 처리하기 전에 감액 청구서(credit note), 여러 통화, 공급업체가 다르지만 번호가 같은 청구서, 할인, 여러 페이지의 표를 시험하세요. 음수 허용 여부와 중복 청구서 판정 기준도 정합니다. 영어 6행 예제는 이러한 변형이나 일본어·러시아어 스캔의 성능을 보장하지 않습니다.
추출이 맞으면 엑셀 데이터 분석 절차(영어)로 요약과 차트를 만들거나 여러 엑셀 파일 합치기(영어)로 출처를 유지하며 확인된 기록을 통합할 수 있습니다. API 파이프라인이라면 OCR 이후 텍스트→JSON 검증(영어)을 적용하세요. JSON 문법이 맞아도 청구서별 수치 대조는 필요합니다.
최종 목표는 다른 사람이 원본까지 추적할 수 있는 통합 문서입니다. Ofox Chat에서 예제를 먼저 실행하고 실제 업무에도 같은 검증 기준을 적용하세요.


