PDF: поиск шрифтов и в Windows-путях (запасной Arial для локального теста)

This commit is contained in:
apuc committed 2026-09-22 13:57:36 +03:00
1 parent 25ed2e3899
commit 13809d20a5
2 files changed
+27 -8

No files matched your search

+1
View File
@@ -7,6 +7,7 @@ videos/
venv/ venv/
bin/ bin/
certs/ certs/
fonts/
# Логи (могут содержать токены SDK) # Логи (могут содержать токены SDK)
*.log *.log
+26 -8
View File
@@ -21,17 +21,35 @@ from docx.shared import Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.enum.text import WD_ALIGN_PARAGRAPH
# --- Шрифты для кириллицы в PDF --- # --- Шрифты для кириллицы в PDF ---
# Ищем шрифты в нескольких местах: Linux (сервер) и Windows (локально).
import os as _os
_FONT_DIR = _os.path.join(_os.path.dirname(_os.path.abspath(__file__)), "fonts")
FONT_PATHS = { FONT_PATHS = {
"DejaVuSans": "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", "DejaVuSans": [
"DejaVuSans-Bold": "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
"DejaVuSans-Oblique": "/usr/share/fonts/truetype/dejavu/DejaVuSans-Oblique.ttf", _os.path.join(_FONT_DIR, "DejaVuSans.ttf"),
"C:/Windows/Fonts/arial.ttf", # запасной на Windows (поддерживает кириллицу)
],
"DejaVuSans-Bold": [
"/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf",
_os.path.join(_FONT_DIR, "DejaVuSans-Bold.ttf"),
"C:/Windows/Fonts/arialbd.ttf",
],
"DejaVuSans-Oblique": [
"/usr/share/fonts/truetype/dejavu/DejaVuSans-Oblique.ttf",
_os.path.join(_FONT_DIR, "DejaVuSans-Oblique.ttf"),
"C:/Windows/Fonts/ariali.ttf",
],
} }
for name, path in FONT_PATHS.items(): for name, paths in FONT_PATHS.items():
try: for path in paths:
pdfmetrics.registerFont(TTFont(name, path)) try:
except Exception: pdfmetrics.registerFont(TTFont(name, path))
pass break
except Exception:
continue
# Регистрируем семейство, чтобы reportlab понимал, что DejaVuSans-Bold — # Регистрируем семейство, чтобы reportlab понимал, что DejaVuSans-Bold —
# это жирный вариант DejaVuSans (иначе Paragraph падает с "Can't map family/bold/italic"). # это жирный вариант DejaVuSans (иначе Paragraph падает с "Can't map family/bold/italic").