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'\b\d{10}\b') kwota_pattern = re.compile(r'\b\d+[\.,]?\d*\b') data_pattern = re.compile(r'\b\d{2}\.\d{2}\.\d{4}\b') 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()) # Szukamy danych w tekście entities = extractor(full_text) seller_name = [] seller_nip = None items = [] total_amount = None invoice_date = None for entity in entities: if "ORG" in entity["entity_group"]: seller_name.append(entity["word"]) # Zbieramy nazwę sprzedawcy # Znajdujemy wartości numeryczne dla NIP, kwot, dat seller_nip = nip_pattern.search(full_text) invoice_date = data_pattern.search(full_text) # **Naprawiamy błąd przetwarzania liczb** kwoty = kwota_pattern.findall(full_text) kwoty = [float(k.replace(",", ".")) for k in kwoty if k.replace(",", ".").replace(".", "").isdigit()] # Zamiana przecinka na kropkę total_amount = max(kwoty) if kwoty else None # Pobranie największej wartości jako całkowita kwota faktury return { "Sprzedawca": " ".join(seller_name) if seller_name else "Nie znaleziono", "NIP": seller_nip.group() if seller_nip else "Nie znaleziono", "Data faktury": invoice_date.group() if invoice_date else "Nie znaleziono", "Kwota całkowita": total_amount if total_amount 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ę faktury." ) if __name__ == "__main__": iface.launch()