Spaces:
Sleeping
Sleeping
import gradio as gr | |
import pdfplumber | |
import re | |
from transformers import LayoutLMForTokenClassification, AutoTokenizer | |
import torch | |
model_name = "kryman27/layoutlmv3-finetuned" | |
model = LayoutLMForTokenClassification.from_pretrained(model_name) | |
tokenizer = AutoTokenizer.from_pretrained(model_name) | |
# Wzorce regex dla nowych p贸l | |
nip_pattern = re.compile(r'\b(?:PL\s?)?\d{10}\b') | |
invoice_number_pattern = re.compile(r'Faktura\s*(?:VAT)?\s*(?:nr\.?|#)\s*([\w\-/]+)', re.IGNORECASE) | |
sale_date_pattern = re.compile(r'Data\s+wystawienia[:\s]*([\d]{2}[.\-/][\d]{2}[.\-/][\d]{4})', re.IGNORECASE) | |
delivery_date_pattern = re.compile(r'Data\s+dostawy[:\s]*([\d]{2}[.\-/][\d]{2}[.\-/][\d]{4})', re.IGNORECASE) | |
payment_date_pattern = re.compile(r'(?:Termin\s+p艂atno艣ci|Data\s+p艂atno艣ci)[:\s]*([\d]{2}[.\-/][\d]{2}[.\-/][\d]{4})', re.IGNORECASE) | |
order_number_pattern = re.compile(r'Zam贸wienie\s*Nr[:\s]*([\w\-/]+)', re.IGNORECASE) | |
order_date_pattern = re.compile(r'Data\s+zam贸wienia[:\s]*([\d]{2}[.\-/][\d]{2}[.\-/][\d]{4})', re.IGNORECASE) | |
sale_order_pattern = re.compile(r'Zlecenie\s+sprzeda偶y\s*Nr[:\s]*([\w\-/]+)', re.IGNORECASE) | |
payment_amount_pattern = re.compile(r'(?:Kwota\s+zap艂acona)[:\s]*([\d.,]+)', re.IGNORECASE) | |
payment_method_pattern = re.compile(r'(?:Forma\s+p艂atno艣ci)[:\s]*([\w/]+)', re.IGNORECASE) | |
def extract_section(text, section_title): | |
pattern = re.compile(rf'{section_title}:(.*?)(?=\n\S|$)', re.IGNORECASE | re.DOTALL) | |
match = pattern.search(text) | |
return match.group(1).strip() if match else None | |
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()) | |
# Wyodr臋bnienie sekcji na podstawie tytu艂贸w | |
sprzedawca_section = extract_section(full_text, "Sprzedawca") | |
nabywca_section = extract_section(full_text, "Nabywca") | |
sprzedawca = {} | |
nabywca = {} | |
faktura = {} | |
platnosc = {} | |
pozycje = [] # Do implementacji ekstrakcji tabelarycznej | |
podsumowanie = {} | |
# Ekstrakcja danych Sprzedawcy | |
if sprzedawca_section: | |
lines = sprzedawca_section.splitlines() | |
sprzedawca['Nazwa'] = lines[0].strip() if lines else "Nie znaleziono" | |
nip_match = nip_pattern.search(sprzedawca_section) | |
sprzedawca['NIP'] = nip_match.group() if nip_match else "Nie znaleziono" | |
bdo_match = re.search(r'BDO[:\s]*([\w\d]+)', sprzedawca_section, re.IGNORECASE) | |
sprzedawca['Numer Rejestracyjny BDO'] = bdo_match.group(1) if bdo_match else "Nie znaleziono" | |
sprzedawca['Adres'] = lines[1].strip() if len(lines) > 1 else "Nie znaleziono" | |
telefon_match = re.search(r'tel\.?[:\s]*([\+\d\s()-]+)', sprzedawca_section, re.IGNORECASE) | |
sprzedawca['Telefon'] = telefon_match.group(1).strip() if telefon_match else "Nie znaleziono" | |
fax_match = re.search(r'fax\.?[:\s]*([\+\d\s()-]+)', sprzedawca_section, re.IGNORECASE) | |
sprzedawca['Fax'] = fax_match.group(1).strip() if fax_match else "Nie znaleziono" | |
else: | |
sprzedawca = { | |
"Nazwa": "Nie znaleziono", | |
"NIP": "Nie znaleziono", | |
"Numer Rejestracyjny BDO": "Nie znaleziono", | |
"Adres": "Nie znaleziono", | |
"Telefon": "Nie znaleziono", | |
"Fax": "Nie znaleziono" | |
} | |
# Ekstrakcja danych Nabywcy | |
if nabywca_section: | |
lines = nabywca_section.splitlines() | |
nabywca['Nazwa'] = lines[0].strip() if lines else "Nie znaleziono" | |
nip_match = nip_pattern.search(nabywca_section) | |
nabywca['NIP'] = nip_match.group() if nip_match else "Nie podano" | |
nabywca['Adres'] = lines[1].strip() if len(lines) > 1 else "Nie znaleziono" | |
klient_match = re.search(r'Nr\s+Klienta[:\s]*([\w\d]+)', nabywca_section, re.IGNORECASE) | |
nabywca['Nr Klienta'] = klient_match.group(1) if klient_match else "Nie znaleziono" | |
else: | |
nabywca = { | |
"Nazwa": "Nie znaleziono", | |
"NIP": "Nie podano", | |
"Adres": "Nie znaleziono", | |
"Nr Klienta": "Nie znaleziono" | |
} | |
# Ekstrakcja danych faktury | |
invoice_number_match = invoice_number_pattern.search(full_text) | |
faktura['Numer'] = invoice_number_match.group(1) if invoice_number_match else "Nie znaleziono" | |
sale_date_match = sale_date_pattern.search(full_text) | |
faktura['Data Wystawienia'] = sale_date_match.group(1) if sale_date_match else "Nie znaleziono" | |
delivery_date_match = delivery_date_pattern.search(full_text) | |
faktura['Data Dostawy'] = delivery_date_match.group(1) if delivery_date_match else "Nie znaleziono" | |
order_number_match = order_number_pattern.search(full_text) | |
faktura['Zam贸wienie Nr'] = order_number_match.group(1) if order_number_match else "Nie znaleziono" | |
order_date_match = order_date_pattern.search(full_text) | |
faktura['Data Zam贸wienia'] = order_date_match.group(1) if order_date_match else "Nie znaleziono" | |
sale_order_match = sale_order_pattern.search(full_text) | |
faktura['Zlecenie Sprzeda偶y Nr'] = sale_order_match.group(1) if sale_order_match else "Nie znaleziono" | |
# Ekstrakcja danych p艂atno艣ci | |
payment_date_match = payment_date_pattern.search(full_text) | |
platnosc['Termin Zap艂aty'] = payment_date_match.group(1) if payment_date_match else "Nie znaleziono" | |
payment_method_match = payment_method_pattern.search(full_text) | |
platnosc['Forma Zap艂aty'] = payment_method_match.group(1) if payment_method_match else "Nie znaleziono" | |
payment_amount_match = payment_amount_pattern.search(full_text) | |
platnosc['Kwota Zap艂acona'] = float(payment_amount_match.group(1).replace(',', '.')) if payment_amount_match else "Nie znaleziono" | |
# Ekstrakcja podsumowania (przyk艂adowo) | |
podsumowanie_match = re.search(r'Razem[:\s]*([\d.,]+)', full_text) | |
podsumowanie['Suma Brutto'] = float(podsumowanie_match.group(1).replace(',', '.')) if podsumowanie_match else "Nie znaleziono" | |
result = { | |
"Sprzedawca": sprzedawca, | |
"Nabywca": nabywca, | |
"Faktura": faktura, | |
"P艂atno艣膰": platnosc, | |
"Pozycje": pozycje, | |
"Podsumowanie": podsumowanie | |
} | |
return result | |
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 narz臋dzie zwr贸ci szczeg贸艂owe dane faktury." | |
) | |
#UI start | |
if __name__ == "__main__": | |
iface.launch() | |