핵심 요약:
- 파이썬은 인보이스에서 데이터 추출을 자동화할 수 있지만, 만능 솔루션은 아닙니다.
- Parseur는 파이썬을 활용해 인보이스에서 데이터 추출을 간편하게 도와줍니다.
- PDF는 데이터 포맷이 아니라 종이 문서의 인쇄용 시각적 표현 형식입니다.
PDF 포맷
PDF 포맷은 인보이스 등 종이 문서를 디자인의 제약 없이 정확하게 디지털로 표현할 수 있도록 해줍니다. 이 형식은 종이 인쇄 세계에서 비롯되었으며, 실제 인쇄 페이지의 디지털 재현을 염두에 두고 개발되었습니다. 이처럼 유연성이 크기 때문에, PDF 작성자는 자유롭게 문서를 표현하면서 각종 표준과 규제도 준수할 수 있습니다.
하지만 PDF 내부에 데이터가 '잠겨' 있는 경우, 이것을 꺼내는 데 어려움이 따릅니다. PDF의 자유롭고 복잡한 구조는, 기업이 매일 처리해야 하는 방대한 데이터를 체계적이고 일관되게 관리해야 하는 현실과 서로 충돌할 수 있습니다.

인보이스에서 데이터를 추출하는 단계
인보이스는 대부분 PDF 형식입니다. 인보이스는 공급자와 고객 사이의 거래를 공식화하며, 상품 또는 서비스가 일정 금액과 맞바뀌었음을 증명합니다. 이 문서에서 데이터를 추출하려면 다음과 같은 절차가 필요합니다:
- 인보이스에서 추출할 데이터의 구조(스키마)를 정의합니다.
- 인보이스를 이미지에서 텍스트로 변환합니다.
- 데이터 스키마에 따라 인보이스에서 텍스트를 추출합니다.
- 추출된 데이터를 수집합니다.

인보이스 데이터 스키마 정의
인보이스는 다양한 공급자별로 각각의 방식과 형식으로 커스터마이즈됩니다. 하지만 실질적으로 모든 인보이스에는 공급자 정보, 고객 정보, 인보이스 번호, 날짜, 그리고 각 항목(수량, 설명, 단가, 가격) 목록이 반드시 필요합니다. 인보이스 데이터 포맷을 정의할 때 가장 좋은 출발점은 사용하는 회계 소프트웨어의 구조를 참고하는 것입니다. 결과적으로 추출된 데이터를 저장하게 될 곳이 바로 회계 소프트웨어니까요. 만약 모든 예외 상황까지 포함하는 포맷이 필요하다면 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"
}
}
}
}
}
인보이스를 이미지에서 텍스트로 변환하기

PDF 파일에는 이미지가 포함되어 있을 수 있습니다. 예를 들어, 직원이 인보이스를 스마트폰으로 촬영한 후 PDF로 저장해서 회계팀에 전달할 수 있습니다. 회계팀은 이 인보이스에서 데이터를 추출해 오류 없이 회계 시스템에 입력해야 합니다. 다음 단계에서는 광학 문자 인식(OCR) 시스템을 이용해 이미지를 텍스트로 변환해야 합니다. 대표적인 OCR 시스템으로는 Tesseract가 있습니다. Tesseract는 C와 C++로 작성되어 있습니다. 파이썬에서 Tesseract를 사용하려면 PyTesseract 같은 바인딩이 필요합니다. 바인딩이란 특정 언어(여기서는 파이썬)에서 작성되지 않은 소프트웨어 라이브러리(여기서는 Tesseract)를 호출할 수 있게 도와주는 인터페이스를 말합니다. 여러 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의 템플릿 엔진을 활용해 관리를 쉽게 할 수 있고, 오랜 기간 축적된 다양한 템플릿 라이브러리도 제공합니다. 여러 추출 방식을 상황에 맞게 선택하거나 혼합해 사용할 수 있으며, 결과를 직접 검토하고 필요에 따라 수정할 수도 있습니다. 이 과정은 추출 정확도를 점진적으로 높이는 데 매우 중요합니다.
추출한 데이터 수집하기
파이썬으로 폴더 내 여러 인보이스 파일을 반복 처리하며 데이터를 추출할 수 있습니다. 예를 들어 인보이스 번호와 총 금액을 추출해 CSV로 출력하는 코드는 다음과 같습니다:
import os
import re
import pdftotext
# 폴더의 모든 PDF 파일 반복 처리
for filename in os.listdir("invoices/"):
if not filename.endswith(".pdf"):
continue
# 인보이스 파일 열기
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를 활용해 더 빠르고, 유연하며, 정확하게 인보이스 데이터를 추출할 수 있습니다.
마지막 업데이트






