파이썬으로 인보이스에서 데이터 추출하기

Portrait of Sylvain Josserand
작성자 Sylvain Josserand Parseur 공동 창립자 및 CTO
0 분 소요
마지막 업데이트

핵심 요약:

  • 파이썬은 인보이스에서 데이터 추출을 자동화할 수 있는 강력한 도구지만, 모든 상황에 적합한 만능 해법은 아닙니다.
  • Parseur는 파이썬을 활용하여 인보이스 데이터 추출을 한층 더 쉽게 만들어줍니다.
  • PDF는 실제 데이터 포맷이 아니라, 종이 문서의 시각적 표현에 최적화된 파일 형식입니다.

PDF 포맷

PDF 포맷은 인보이스와 같은 종이 문서를 디지털로 정확하게 재현할 수 있도록 설계되어 다양한 디자인을 자유롭게 구현할 수 있게 돕습니다. 이러한 특징 덕분에 PDF 작성자는 자유롭게 인보이스를 생성하고, 필요한 법적 기준도 적용할 수 있습니다.

그러나 PDF 내부에 데이터가 숨겨져 있을 때는 관리와 추출에 어려움이 있습니다. PDF의 자유로운 구조와 복잡성은 기업들이 반복적으로 처리해야 하는 대량 데이터의 체계적이고 일관된 관리 방식과 상충할 수 있습니다.

A screen capture of PDF file format layers
PDF file format layers

인보이스에서 데이터를 추출하는 절차

인보이스들은 대개 PDF 형식으로 제공됩니다. 인보이스는 공급자와 고객 간의 거래 내역을 공식화하고, 특정 금액의 상품이나 서비스가 이전되었음을 증명합니다. 이러한 인보이스에서 데이터를 추출하려면 다음 단계를 순차적으로 진행해야 합니다:

  1. 인보이스에서 추출하고자 하는 데이터의 구조(스키마)를 정의합니다.
  2. 인보이스를 이미지에서 텍스트로 변환합니다.
  3. 데이터 스키마에 맞춰 인보이스 내에서 텍스트 데이터를 추출합니다.
  4. 필요한 데이터를 수집하여 활용합니다.

A screen capture of Invoice data extraction process
Invoice data extraction process

인보이스 데이터 스키마 정의

인보이스는 각 공급자에 따라 다양한 형식과 디자인으로 커스터마이즈되어 발행됩니다. 하지만 보통 포함해야 하는 기본 정보는 크게 다르지 않습니다: 공급자, 고객, 인보이스 번호, 발행일, 그리고 개별 항목(수량, 설명, 단가 등) 목록입니다. 회계 소프트웨어에서 인보이스 데이터 구조를 참고하는 것이 좋은 출발점이 될 수 있습니다. 실제로 추출된 인보이스 데이터를 저장하는 곳이 바로 회계 소프트웨어이기 때문입니다. 더 완전한 데이터 포맷이 필요하다면 schema.org을 참고해 보세요. 이곳에는 Invoice 등 대표적인 인보이스 표준 데이터 스키마가 정의되어 있습니다. Parseur 역시 인보이스를 위한 기본 데이터 스키마를 제공합니다. 필요에 따라 인보이스 메일박스의 필드명을 바꿔 스키마를 사용자에 맞게 변경할 수 있습니다. 데이터 구조가 정의됐다면, 이제 인보이스 데이터가 이미지에 숨어 있는 경우 텍스트로 변환해야 합니다.

예를 들어, JSON Swagger 포맷을 사용해 다음과 같이 인보이스의 주요 필드를 선언할 수 있습니다:

{
    "InvoiceNumber": {
        "type": "string",
        "description": "The invoice number"
    },
    "InvoiceIssueDate": {
        "type": "string",
        "description": "The invoice date"
    },
    "Items": {
        "type": "array",
        "description": "The list of items in the invoice",
        "items": {
            "type": "object",
            "properties": {
                "quantity": {
                    "type": "number",
                    "description": "The quantity of the item"
                },
                "description": {
                    "type": "string",
                    "description": "The description of the item"
                },
                "unit_price": {
                    "type": "number",
                    "description": "The unit price of the item"
                },
                "price": {
                    "type": "number",
                    "description": "The total price of the item"
                }
            }
        }
    }
}

인보이스를 이미지에서 텍스트로 변환하기

A screen capture of an invoice taken from a smartphone
Picture of an invoice taken from a smartphone

PDF 파일에는 이미지가 내장될 수 있습니다. 예를 들어 직원이 인보이스를 스마트폰으로 촬영한 이미지를 PDF로 저장해 회계팀에 보낼 수도 있습니다. 이런 이미지형 인보이스에서 데이터를 추출하려면 광학 문자 인식(OCR) 기술을 사용하여 이미지를 텍스트로 변환해야 합니다. 대표적인 OCR 엔진으로는 Tesseract가 있습니다. Tesseract는 C·C++로 작성되어 있으며, 파이썬에서 사용하려면 PyTesseract 같은 바인딩 모듈이 필요합니다. 여러 OCR 시스템 비교 자료도 있으니, 프로젝트 상황과 문서 품질에 따라 적합한 도구를 선택할 수 있습니다. Parseur는 이미지 기반 문서를 자동으로 텍스트로 변환하므로, 별도의 추가 작업 없이 바로 데이터 추출이 가능합니다.

데이터 스키마에 맞춰 인보이스에서 텍스트 추출하기

PDF가 검색 가능한 텍스트 형태로 바뀌었다면, pdftotext 파이썬 라이브러리를 사용해 PDF 파일에서 텍스트를 얻을 수 있습니다. 아래는 PDF에서 텍스트 데이터를 추출하는 파이썬 예제 코드입니다:

import pdftotext

# 인보이스 파일 열기
with open("invoice.pdf", "rb") as file_handle:
    pdf = pdftotext.PDF(file_handle)

# 각 페이지 텍스트 출력
for page in pdf:
    print(page)

이 스크립트를 convert_pdf_to_text.py로 저장해서 실행하면 인보이스 전체 텍스트가 출력됩니다. 결과물을 파일로 저장하려면 다음처럼 실행하세요:

$ python convert_pdf_to_text.py > invoice.txt

이제 인보이스가 텍스트 파일로 준비된 상태에서, 아래 방법들을 조합해 필요한 데이터를 추출할 수 있습니다:

  • 정규표현식으로 원하는 데이터(예: 인보이스 번호 등)를 선택적으로 추출할 수 있습니다. 단, 텍스트 포맷이 바뀌면 패턴을 계속 수정해야 하고, 표 형태 데이터에는 적용이 어렵습니다.
  • 동적 OCR이나 영역 OCR 등 시각적 분석 기반 템플릿 시스템을 활용할 수 있습니다. 이 방식은 훨씬 견고하지만 복잡도가 높습니다.
  • 머신러닝 기반 인식 기술로도 접근할 수 있습니다. 머신러닝 기반 접근은 다양한 포맷에 범용적이지만, 학습이 필요하며 100% 정확도는 보장되지 않으니 수동 검토가 필수입니다.

예를 들어 파이썬의 re 모듈을 이용해 인보이스 번호를 추출하는 코드는 다음과 같습니다:

import re

# 인보이스 텍스트 파일 읽기
with open("invoice.txt", "r") as file_handle:
    invoice = file_handle.read()

# 인보이스 번호 추출
invoice_number = re.search(r"Invoice number: (\w+)", invoice).group(1)
print(invoice_number)

이 코드를 extract.py로 저장 후 실행하면 인보이스 번호가 표준 출력에 표시됩니다:

$ python extract.py

예시 결과:

INV-1234

단, 위 코드는 인보이스 텍스트에 반드시 Invoice number: INV-1234 같은 형식이 포함되어 있을 때만 동작하며, 인보이스 포맷이 바뀔 때마다 정규표현식을 수정해야 한다는 문제가 있습니다. 수많은 포맷의 인보이스를 일괄적으로 처리하려면, 상당한 시간과 노력이 필요합니다.

이런 경우 Parseur의 자동화 솔루션이 큰 도움이 될 수 있습니다.

무료 계정 만들기
Parseur로 시간과 노력을 절약하세요. 문서 처리를 자동화하세요.

정규표현식 파싱이 필요하다면 Parseur의 템플릿 엔진을 활용해 복잡한 데이터 추출 작업을 손쉽게 처리할 수 있습니다. 또한 광범위한 템플릿 라이브러리도 제공되므로, 다양한 상황에 맞는 추출 방식을 손쉽게 선택하거나 조합하여 사용할 수 있습니다. 추출 결과는 사용자가 직접 검토·수정할 수 있어, 시간이 지날수록 점진적으로 추출 정확도를 높일 수 있습니다.

추출한 데이터 수집하기

파이썬에서는 폴더 단위로 여러 인보이스 파일을 반복 처리하며 데이터를 추출할 수 있습니다. 예를 들면, 인보이스 번호와 총 금액을 추출하여 CSV로 저장하는 코드는 다음과 같습니다:

import os
import re

import pdftotext

# 'invoices' 폴더의 PDF 파일을 반복 처리
for filename in os.listdir("invoices/"):
    if not filename.endswith(".pdf"):
        continue

    # PDF 파일 읽기
    with open("invoices/" + filename, "rb") as file_handle:
        pdf = pdftotext.PDF(file_handle)

    # CSV 헤더 출력
    print("InvoiceNumber,TotalAmount")

    # 각 페이지 반복
    for page in pdf:
        # 인보이스 번호와 총 금액 추출
        invoice_number = re.search(r"Invoice number: (\w+)", page).group(1)
        total_amount = re.search(r"Total amount: (\w+)", page).group(1)
        print(invoice_number, total_amount, sep=",")

이 스크립트를 extract_to_csv.py로 저장한 뒤 실행하면 인보이스 번호와 금액이 표준 출력에 표시되고, 다음처럼 실행하여 CSV 파일로 저장할 수 있습니다:

$ python extract_to_csv.py > invoices.csv

Parseur에서는 인보이스 데이터 추출 후 전체 데이터를 스프레드시트로 다운로드하거나, 회계 소프트웨어로 바로 내보낼 수 있습니다. 웹훅 통합, Make, Zapier, Microsoft Power Automate 등 다양한 방법으로 연동이 가능하고, API를 통해 JSON 데이터로도 바로 활용할 수 있습니다.

결론

본 글이 파이썬 인보이스 데이터 추출 자동화에 도움이 되었기를 바랍니다. 파이썬을 이용한 직접 구현 방식은 인보이스 포맷이 단일하고 충분한 시간이 투자될 수 있다면 적합한 선택입니다. 하지만 다양한 포맷을 처리해야 하거나 신속하게 자동화를 구축해야 한다면, 수많은 템플릿이 준비된 Parseur를 통해 빠르고 유연하게, 더욱 정확하게 인보이스 데이터 추출을 시작할 수 있습니다.

마지막 업데이트

AI 기반 데이터 추출 소프트웨어.
오늘 바로 Parseur를 시작하세요.

이메일, PDF, 스프레드시트에서 텍스트 추출을 자동화하세요.
수백 시간의 반복 업무를 절감할 수 있습니다.
AI로 업무 자동화를 경험해 보세요.

Parseur rated 5/5 on Capterra
Parseur.com has the highest adoption on G2
Parseur.com has the happiest users badge on Crozdesk
Parseur rated 5/5 on GetApp
Parseur rated 4.5/5 on Trustpilot