Skip to content

Обработка PDF

В Narmak ERP используются два отдельных сервиса для работы с PDF.

Gotenberg

URL: http://gotenberg:3000
Переменная: GOTENBERG_URL
Документация: https://gotenberg.dev

Назначение

Конвертация HTML-шаблонов в PDF для генерации печатных форм документов.

Использование

python
# app/document/services/pdf_invoice_service.py

import requests

def generate_pdf_from_html(html: str, filename: str) -> bytes:
    """Сгенерировать PDF из HTML через Gotenberg"""
    response = requests.post(
        f"{settings.GOTENBERG_URL}/forms/chromium/convert/html",
        files={"index.html": ("index.html", html.encode(), "text/html")},
        data={
            "paperWidth": "210",
            "paperHeight": "297",
            "marginTop": "10",
            "marginBottom": "10",
            "marginLeft": "10",
            "marginRight": "10",
        }
    )
    return response.content

Что генерирует

ДокументШаблон
Товарная накладная (ТОРГ-12)HTML → PDF
Счёт на оплатуHTML → PDF
УПДHTML → PDF
Акт выполненных работHTML → PDF

PDF Invoice Processor (микросервис)

URL: http://pdf-invoice-processor:8000
Переменная: PDF_INVOICE_SERVICE_URL

Назначение

Распознавание и парсинг входящих PDF счетов от поставщиков. Использует OCR (Tesseract) для извлечения данных.

Возможности

  • Распознавание номера счёта, даты, суммы, ИНН поставщика
  • Извлечение таблицы позиций
  • Создание черновика документа в системе по данным из PDF

API микросервиса

POST /parse
Content-Type: multipart/form-data
file: <pdf_file>

Response:
{
  "invoice_number": "ИНФ-1234",
  "date": "2025-01-15",
  "total": 150000.00,
  "vat": 25000.00,
  "supplier_inn": "7707083893",
  "positions": [
    {"name": "Товар А", "qty": 10, "price": 15000.0}
  ]
}

Frontend: libs/pdf-invoice/

Модуль обработки PDF доступен в Main Office через маршрут /files-ai:

typescript
// libs/pdf-invoice/src/lib/services/pdf-invoice.service.ts
export class PdfInvoiceService {
  parsePdf(file: File): Observable<ParsedInvoice> {
    const formData = new FormData()
    formData.append('file', file)
    return this.http.post<ParsedInvoice>(
      `${environment.pdfInvoiceApiUrl}/parse`,
      formData
    )
  }
}

Пользователь загружает PDF счёта → система распознаёт → создаётся черновик заказа поставщику.

Хранение файлов (Selectel)

Все загруженные файлы (PDF, изображения, документы) хранятся в Selectel Object Storage:

python
# settings.py
DEFAULT_FILE_STORAGE = 'django_selectel.storage.SelectelStorage'
SELECTEL_STORAGE = {
    'container': 'narmak-files',
    'user': settings.SELECTEL_USER,
    'key': settings.SELECTEL_KEY,
}

Файлы доступны через модель Files:

python
class Files(Model):
    document = FK(Documents, null=True)
    file = FileField(upload_to='documents/')
    file_type = FK(FileType)
    name = CharField()
    size = IntegerField()
    created_by = FK(User)
    created_at = DateTimeField()