Распознаватель PDF-счетов

Распознаватель 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

Report Page