Spaces:
Running
Running
File size: 2,374 Bytes
07d0354 814c19e 061d5cb 10213d3 99ddfcc 814c19e bf3bfc2 1379608 99ddfcc 814c19e 159c760 07d0354 1379608 99ddfcc 1379608 99ddfcc 1379608 10213d3 99ddfcc bf3bfc2 1379608 bf3bfc2 99ddfcc 1379608 99ddfcc 9f38b98 99ddfcc 9f38b98 99ddfcc 1379608 9f38b98 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
import gradio as gr
import pdfplumber
import re
from transformers import pipeline
# Model do rozpoznawania nazw organizacji i wartości numerycznych
extractor = pipeline("ner", model="dbmdz/bert-large-cased-finetuned-conll03-english", aggregation_strategy="simple")
# Reguły do wykrywania NIP, kwot, dat
nip_pattern = re.compile(r'\bPL\s?\d{10}\b|\b\d{10}\b') # Polski NIP (z "PL" lub bez)
kwota_pattern = re.compile(r'\b\d+[\.,]?\d*\b') # Kwoty: np. 123.45 lub 123
data_pattern = re.compile(r'\b\d{2}\.\d{2}\.\d{4}\b') # Daty w formacie DD.MM.YYYY
payment_keywords = ["data płatności", "termin płatności", "zapłata", "płatność"]
def extract_invoice_data(pdf_file):
with pdfplumber.open(pdf_file) as pdf:
full_text = "\n".join(page.extract_text() for page in pdf.pages if page.extract_text())
# Znalezienie nazw organizacji
entities = extractor(full_text)
seller_name = []
for entity in entities:
if "ORG" in entity["entity_group"]:
seller_name.append(entity["word"])
# Znajdujemy wartości numeryczne dla NIP, kwot, dat
seller_nip = nip_pattern.search(full_text)
kwoty = kwota_pattern.findall(full_text)
kwoty = [float(k.replace(",", ".")) for k in kwoty if k.replace(",", ".").replace(".", "").isdigit()]
total_amount = max(kwoty) if kwoty else None
# Szukamy daty płatności na podstawie kontekstu
payment_date = None
for line in full_text.split("\n"):
if any(keyword in line.lower() for keyword in payment_keywords):
date_match = data_pattern.search(line)
if date_match:
payment_date = date_match.group()
break
return {
"Sprzedawca": " ".join(seller_name) if seller_name else "Nie znaleziono",
"NIP": seller_nip.group() if seller_nip else "Nie znaleziono",
"Kwota całkowita": total_amount if total_amount else "Nie znaleziono",
"Data płatności": payment_date if payment_date else "Nie znaleziono"
}
# Interfejs użytkownika w Hugging Face Spaces
iface = gr.Interface(
fn=extract_invoice_data,
inputs=gr.File(label="Wybierz plik PDF"),
outputs="json",
title="Ekstrakcja danych z faktury",
description="Prześlij plik PDF, a model zwróci dane sprzedawcy, NIP, kwotę i datę płatności."
)
if __name__ == "__main__":
iface.launch()
|