Обработка 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()