Распознаватель PDF-счетов
import fitz # PyMuPDF
import re
import json
import os
import pandas as pd
def extract_text_from_pdf(pdf_path):
doc = fitz.open(pdf_path)
text = ""
for page in doc:
text += page.get_text()
return text
def parse_invoice_data(text):
result = {}
# Номер счёта
match = re.search(r'(СЧ[ЁЕ]Т[\s№:]*)\s?(\w+-?\d+)', text, re.IGNORECASE)
if match:
result['Номер'] = match.group(2)
# Дата
match = re.search(r'(\d{2}[./-]\d{2}[./-]\d{4})', text)
if match:
result['Дата'] = match.group(1)
# Сумма
match = re.search(r'ИТОГО[:\s]*([\d\s.,]+)', text.upper())
if match:
result['Сумма'] = float(match.group(1).replace(" ", "").replace(",", "."))
# Поставщик (поиск слова "ООО" + название)
match = re.search(r'(ООО\s+«?[\w\s\-]+»?)', text)
if match:
result['Поставщик'] = match.group(1).strip()
return result
def save_as_json(data, filename):
with open(filename, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
def main(pdf_path):
if not os.path.exists(pdf_path):
print("Файл не найден!")
return
text = extract_text_from_pdf(pdf_path)
data = parse_invoice_data(text)
if not data:
print("Не удалось извлечь данные.")
return
json_path = pdf_path.replace('.pdf', '.json')
save_as_json(data, json_path)
print(f"✅ Готово! Данные сохранены в {json_path}")
if __name__ == "__main__":
import sys
if len(sys.argv) < 2:
print("Использование: python parser.py путь_к_файлу.pdf")
else:
main(sys.argv[1])
# Пример запуска
python parser.py счета/январь_2025.pdf