Wydobywanie danych z faktur za pomocą Pythona

Najważniejsze informacje:

  • Python może zautomatyzować wydobywanie danych z faktur, choć nie ma jednego uniwersalnego rozwiązania
  • Parseur korzysta z Pythona do automatycznego wydobycia danych z faktur za Ciebie
  • PDF to nie format danych, lecz typograficzne przedstawienie dokumentu papierowego

Format PDF

Format PDF jest uniwersalny i pozwala dokładnie odwzorować papierowe dokumenty, takie jak faktury, bez ograniczania ich wyglądu. Jego geneza wywodzi się ze świata druku, a sam format został stworzony jako cyfrowa reprezentacja drukowanej strony. Dzięki tej elastyczności twórcy plików PDF mają pełną swobodę w zakresie projektowania, przy jednoczesnej zgodności z różnymi standardami i regulacjami.

Problem pojawia się jednak wtedy, gdy potrzebujemy wydobyć z pliku PDF znajdujące się w nim dane. Elastyczna i nierzadko skomplikowana natura PDF-ów jest przeciwieństwem potrzeby uporządkowania informacji — tej niezbędnej do zarządzania dużą ilością danych na co dzień przetwarzanych w firmach.

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

Jakie są etapy wydobywania danych z faktury?

Faktury najczęściej spotykamy w formacie PDF. Faktura dokumentuje transakcję pomiędzy dostawcą a odbiorcą, gdzie produkty lub usługi wymieniane są na ustaloną kwotę. Oto etapy niezbędne, by wydobyć dane z faktury:

  1. Określ schemat danych, które chcesz wydobyć ze swoich faktur
  2. Przekonwertuj fakturę z obrazu na tekst
  3. Wyodrębnij tekst z faktury według zdefiniowanego schematu
  4. Zgromadź wyodrębnione dane

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

Zdefiniuj schemat danych dla swojej faktury

Faktury pochodzą od różnych wystawców i niemal każdy ma odmienny wygląd swoich dokumentów. Mimo tej różnorodności, sedno faktur pozostaje niezmienne: standardowo potrzebujemy informacji o sprzedawcy, kliencie, numerze faktury, dacie i szczegółowej liście pozycji (ilość, opis, koszt). Dobrym punktem wyjścia przy tworzeniu schematu danych do faktur może być twoje oprogramowanie księgowe, bo tam z pewnością docelowo trafią wyodrębnione dane. Jeśli potrzebujesz uniwersalnego modelu danych, zajrzyj na schema.org, gdzie znajdziesz wzorce branżowe do opisu danych, również dla faktur. Parseur proponuje gotowy, domyślny schemat danych dla faktur, ale możesz go dowolnie edytować, zmieniając nazwy pól w skrzynce odbiorczej według własnych potrzeb, zgodnie z instrukcją. Gdy ustalisz swój format danych, możesz przejść do konwersji faktury z obrazu na tekst.

Na przykład taki schemat danych dla faktury możesz zdefiniować w formacie JSON Swagger:

{
    "InvoiceNumber": {
        "type": "string",
        "description": "Numer faktury"
    },
    "InvoiceIssueDate": {
        "type": "string",
        "description": "Data wystawienia faktury"
    },
    "Items": {
        "type": "array",
        "description": "Lista pozycji znajdujących się na fakturze",
        "items": {
            "type": "object",
            "properties": {
                "quantity": {
                    "type": "number",
                    "description": "Ilość pozycji"
                },
                "description": {
                    "type": "string",
                    "description": "Opis pozycji"
                },
                "unit_price": {
                    "type": "number",
                    "description": "Cena jednostkowa pozycji"
                },
                "price": {
                    "type": "number",
                    "description": "Łączna cena pozycji"
                }
            }
        }
    }
}

Przekonwertuj fakturę z obrazu na tekst

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

Plik PDF może zawierać obraz — wystarczy, że pracownik zrobi zdjęcie faktury smartfonem, a następnie zapisze je do PDF i wyśle do księgowości. Dział finansowy musi wtedy wydobyć dane z takiej faktury i wprowadzić je do systemu bezbłędnie. Kolejny etap to konwersja obrazu na tekst za pomocą optycznego rozpoznawania znaków (OCR). Jednym z popularnych silników OCR jest Tesseract. System ten napisano w C i C++. Aby skorzystać z Tesseract w Pythonie, potrzebujesz tzw. bindingu, przykładowo PyTesseract. Binding pozwala wywoływać funkcje biblioteki Tesseract z poziomu kodu w Pythonie. Istnieje wiele rozwiązań OCR, a ich skuteczność zależy zarówno od użytej technologii, jak i jakości skanu. Parseur automatycznie wykryje, czy Twój dokument to obraz, i sam dokona konwersji na tekst. Gdy dane zostaną skonwertowane do postaci tekstowej, możesz przystąpić do ich wydobycia.

Wyodrębnij tekst z faktury zgodnie ze swoim schematem danych

Po uzyskaniu tekstowej wersji PDF-a możesz użyć pythonowej biblioteki pdftotext do wydobycia tekstu z pliku. Oto przykładowy kod do ekstrakcji tekstu z PDF-a:

import pdftotext

# Wczytaj fakturę
with open("invoice.pdf", "rb") as file_handle:
    pdf = pdftotext.PDF(file_handle)

# Iteracja po wszystkich stronach
for page in pdf:
    print(page)

Nazwij plik z tym kodem convert_pdf_to_text.py i uruchom — na wyjściu uzyskasz treść faktury w formacie tekstowym. Jeśli chcesz zapisać tekst do pliku, wystarczy polecenie:

$ python convert_pdf_to_text.py > invoice.txt

Mając dane jako tekst, możesz wydobywać interesujące Cię informacje — na przykład z użyciem jednej z poniższych metod:

  • Skorzystaj z wyrażeń regularnych, aby wydobyć konkretne dane. Wyrażenia regularne są potężnym narzędziem, ale bardzo wrażliwym na zmiany formatu faktury — każda modyfikacja layoutu oznacza konieczność dostosowania wzorca. Co ważne, wyrażenia regularne nie są wygodne przy wydobywaniu danych z tabel.
  • Wykorzystaj system szablonów wizualnych, najlepiej opartych o Dynamiczny OCR lub Strefowy OCR. Ta metoda wymaga więcej pracy przy wdrożeniu, ale jest znacznie bardziej odporna na zmiany formatu dokumentu.
  • Zastosuj rozwiązanie bazujące na uczeniu maszynowym. To podejście jest bardzo rozbudowane i wydajne, ale wymaga przygotowania przykładowych dokumentów do nauki oraz regularnej weryfikacji wyników.

Oto fragment kodu do wydobycia numeru faktury z użyciem narzędzia wyrażeń regularnych re w Pythonie:

import re

# Wczytaj tekst faktury
with open("invoice.txt", "r") as file_handle:
    invoice = file_handle.read()

# Wyodrębnij numer faktury
invoice_number_match = re.search(r"Invoice number: (\w+)", invoice)
if invoice_number_match:
    invoice_number = invoice_number_match.group(1)
    print(invoice_number)

Nazwij ten plik extract.py i uruchom — w konsoli zobaczysz wydobyty numer faktury:

$ python extract.py

Przykładowy wynik:
INV-1234

Pamiętaj: to rozwiązanie działa tylko, gdy faktura zawiera linijkę w formacie Invoice number: INV-1234. Zmiana wyglądu dokumentu wymusi modyfikację wyrażenia regularnego. Przy dużej liczbie niestandardowych szablonów faktur może to być czasochłonne i problematyczne.

Tu z pomocą przychodzi Parseur.

Utwórz darmowe konto
Oszczędzaj czas i wysiłek z Parseur. Automatyzuj swoje dokumenty.

Jeżeli wybierzesz metodę wydobycia danych za pomocą wyrażeń regularnych, możesz zarządzać nimi przez nasz system szablonów. Oferujemy też stale rozbudowywaną bibliotekę gotowych szablonów. W Parseur masz dużą elastyczność — możesz korzystać z wyrażeń regularnych, szablonów wizualnych na bazie OCR lub systemów AI do przetwarzania faktur. Możesz także łączyć różne techniki, by osiągnąć najlepsze rezultaty. Po ekstrakcji danych masz możliwość ich zweryfikowania i korekty, co systematycznie zwiększa skuteczność platformy.

Zbierz wyodrębnione dane

W Pythonie możesz iterować po plikach z fakturami w wybranym folderze i agregować z nich kluczowe dane. Załóżmy, że wyciągamy numer faktury oraz jej całkowitą kwotę, zapisując wyniki do pliku CSV:

import os
import re
import pdftotext

# Wydrukuj nagłówek CSV
print("InvoiceNumber,TotalAmount")

# Iteracja po plikach PDF w katalogu
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)

    # Wyciągamy dane z każdej strony
    for page in pdf:
        invoice_number_match = re.search(r"Invoice number: (\w+)", page)
        total_amount_match = re.search(r"Total amount: (\w+)", page)
        if invoice_number_match and total_amount_match:
            invoice_number = invoice_number_match.group(1)
            total_amount = total_amount_match.group(1)
            print(invoice_number, total_amount, sep=",")

Nazwij skrypt extract_to_csv.py i uruchom, aby otrzymać plik z numerami faktur i ich wartościami, gotowy do dalszej obróbki:

$ python extract_to_csv.py > invoices.csv

Z kolei w Parseur, po wydobyciu danych z faktur, możesz pobrać całość jako arkusz kalkulacyjny lub bezpośrednio wysłać dane do systemu księgowego korzystając z integracji przez webhooki, Make, Zapier, Microsoft Power Automate, lub pobrać je w formacie JSON za pośrednictwem API.

Podsumowanie

Mamy nadzieję, że ten artykuł okazał się pomocny. W skrócie: wydobywanie danych z faktur z Pythonem to wieloetapowy proces, wykonalny samodzielnie, jeśli pracujesz ze spójnymi dokumentami i masz czas na rozwój swoich narzędzi. Jeżeli chcesz oszczędzać czas i szybko uzyskać dane z każdego typu faktury — niezależnie od źródła — warto skorzystać z gotowych rozwiązań takich jak Parseur, które zrobią za Ciebie całą ciężką pracę: skutecznie, elastycznie i automatycznie.

Ostatnia aktualizacja

Oprogramowanie do ekstrakcji danych opartych na AI.
Zacznij korzystać z Parseur już dziś.

Automatyzuj wyodrębnianie tekstu z e-maili, PDF-ów i arkuszy kalkulacyjnych.
Oszczędzaj setki godzin ręcznej pracy.
Postaw na automatyzację pracy z 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