Ed5 commited on
Commit
b46bb37
·
verified ·
1 Parent(s): d9ae303

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +64 -17
app.py CHANGED
@@ -8,6 +8,9 @@ from datetime import datetime
8
  from reportlab.pdfgen import canvas
9
  from reportlab.lib.pagesizes import A4
10
  from reportlab.lib import colors
 
 
 
11
 
12
  # ========== АВТОРИЗАЦИЯ ==========
13
  AUTH_USERNAME = "admin"
@@ -25,6 +28,21 @@ class KDChecker:
25
  self.excel_db = pd.DataFrame()
26
  self.cabinet_list = []
27
  self.known_docs = ["Э3", "В4", "ПЭ3", "ВО", "ТЭ5", "СБ", "С5", "ОЛ", "Э1", "Э4", "Э7", "Д3", "Э6"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
 
29
  def load_excel_db(self, excel_file):
30
  if excel_file is None:
@@ -230,7 +248,9 @@ class KDChecker:
230
  try:
231
  pdf_path = self.create_pdf(title, checklist)
232
  except Exception as e:
233
- return f"❌ Ошибка PDF: {e}", None
 
 
234
 
235
  total = sum(len(v) for v in checklist.values())
236
  method_name = {"manual": "Ручной", "number": "По номеру", "name": "По названию"}.get(method, "?")
@@ -241,14 +261,20 @@ class KDChecker:
241
  path = os.path.join(tempfile.gettempdir(), "CheckList.pdf")
242
  c = canvas.Canvas(path, pagesize=A4)
243
  w, h = A4
244
- font = 'Helvetica'
 
 
245
 
246
  y = h - 50
247
  c.setFont(font, 16)
248
  c.drawString(50, y, "CHECK-LIST")
249
  y -= 25
250
  c.setFont(font, 12)
251
- c.drawString(50, y, f"Cabinet: {cabinet[:50]}")
 
 
 
 
252
  c.drawString(400, y, datetime.now().strftime('%d.%m.%Y'))
253
  y -= 20
254
  c.line(50, y, w - 50, y)
@@ -263,6 +289,9 @@ class KDChecker:
263
  if y < 100:
264
  c.showPage()
265
  y = h - 50
 
 
 
266
  c.setFillColor(colors.darkblue)
267
  c.setFont(font, 11)
268
  c.drawString(50, y, f"File: {fname}")
@@ -275,12 +304,16 @@ class KDChecker:
275
  c.showPage()
276
  y = h - 50
277
  c.setFont(font, 10)
 
 
278
  c.rect(50, y - 2, 8, 8, stroke=1, fill=0)
279
 
 
280
  words = task.replace('\n', ' ').split()
281
  lines, line = [], ""
282
  for word in words:
283
- if len(line) + len(word) < 85:
 
284
  line += word + " "
285
  else:
286
  lines.append(line.strip())
@@ -305,25 +338,39 @@ class KDChecker:
305
  # ========== ИНТЕРФЕЙС ==========
306
  checker = KDChecker()
307
 
308
- with gr.Blocks(title="КД Checker", theme=gr.themes.Soft()) as app:
 
 
 
 
 
309
  gr.Markdown("# ✅ Генератор чек-листов КД")
310
 
311
  with gr.Row():
312
- with gr.Column():
313
- gr.Markdown("### 📁 База знаний")
314
- db_input = gr.File(label="Excel (.xlsx)", file_types=[".xlsx", ".xls"], type="filepath")
315
- cabinet_dd = gr.Dropdown(label="Шкаф вручную", choices=[], interactive=True)
316
- db_status = gr.Textbox(label="Статус", lines=5)
 
 
317
 
318
- with gr.Column():
319
- gr.Markdown("### 📄 Чертежи")
320
- pdf_input = gr.File(label="PDF файлы", file_count="multiple", file_types=[".pdf"], type="filepath")
321
- run_btn = gr.Button("🔍 Сформировать", variant="primary")
322
-
 
 
 
 
323
  with gr.Row():
324
- result_txt = gr.Textbox(label="Результат", lines=5)
325
- result_pdf = gr.File(label="📥 PDF")
 
 
326
 
 
327
  db_input.change(checker.load_excel_db, [db_input], [db_status, cabinet_dd])
328
  run_btn.click(checker.check_files, [pdf_input, cabinet_dd], [result_txt, result_pdf])
329
 
 
8
  from reportlab.pdfgen import canvas
9
  from reportlab.lib.pagesizes import A4
10
  from reportlab.lib import colors
11
+ # === ИМПОРТЫ ДЛЯ ШРИФТОВ ===
12
+ from reportlab.pdfbase import pdfmetrics
13
+ from reportlab.pdfbase.ttfonts import TTFont
14
 
15
  # ========== АВТОРИЗАЦИЯ ==========
16
  AUTH_USERNAME = "admin"
 
28
  self.excel_db = pd.DataFrame()
29
  self.cabinet_list = []
30
  self.known_docs = ["Э3", "В4", "ПЭ3", "ВО", "ТЭ5", "СБ", "С5", "ОЛ", "Э1", "Э4", "Э7", "Д3", "Э6"]
31
+
32
+ # === РЕГИСТРАЦИЯ ШРИФТА (Исправление квадратов) ===
33
+ self.font_name = 'Helvetica' # Запасной вариант
34
+ try:
35
+ # Путь к шрифту относительно папки, где лежит скрипт
36
+ font_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "arial.ttf")
37
+
38
+ if os.path.exists(font_path):
39
+ pdfmetrics.registerFont(TTFont('Arial', font_path))
40
+ self.font_name = 'Arial'
41
+ print(f"✅ Шрифт загружен: {font_path}")
42
+ else:
43
+ print(f"⚠️ Файл шрифта не найден: {font_path}")
44
+ except Exception as e:
45
+ print(f"❌ Ошибка загрузки шрифта: {e}")
46
 
47
  def load_excel_db(self, excel_file):
48
  if excel_file is None:
 
248
  try:
249
  pdf_path = self.create_pdf(title, checklist)
250
  except Exception as e:
251
+ import traceback
252
+ traceback.print_exc() # Пишем в консоль для отладки
253
+ return f"❌ Ошибка генерации PDF: {e}", None
254
 
255
  total = sum(len(v) for v in checklist.values())
256
  method_name = {"manual": "Ручной", "number": "По номеру", "name": "По названию"}.get(method, "?")
 
261
  path = os.path.join(tempfile.gettempdir(), "CheckList.pdf")
262
  c = canvas.Canvas(path, pagesize=A4)
263
  w, h = A4
264
+
265
+ # Используем наш зарегистрированный шрифт
266
+ font = self.font_name
267
 
268
  y = h - 50
269
  c.setFont(font, 16)
270
  c.drawString(50, y, "CHECK-LIST")
271
  y -= 25
272
  c.setFont(font, 12)
273
+
274
+ # Обрезаем очень длинные названия шкафов для заголовка
275
+ cab_title = cabinet[:60] + "..." if len(cabinet) > 60 else cabinet
276
+ c.drawString(50, y, f"Cabinet: {cab_title}")
277
+
278
  c.drawString(400, y, datetime.now().strftime('%d.%m.%Y'))
279
  y -= 20
280
  c.line(50, y, w - 50, y)
 
289
  if y < 100:
290
  c.showPage()
291
  y = h - 50
292
+ # Важно: на новой странице тоже нужно ставить шрифт
293
+ c.setFont(font, 12)
294
+
295
  c.setFillColor(colors.darkblue)
296
  c.setFont(font, 11)
297
  c.drawString(50, y, f"File: {fname}")
 
304
  c.showPage()
305
  y = h - 50
306
  c.setFont(font, 10)
307
+
308
+ # Рисуем квадратик чекбокса
309
  c.rect(50, y - 2, 8, 8, stroke=1, fill=0)
310
 
311
+ # Перенос строк
312
  words = task.replace('\n', ' ').split()
313
  lines, line = [], ""
314
  for word in words:
315
+ # Примерная ширина строки. Arial чуть шире Helvetica, запас 80
316
+ if len(line) + len(word) < 80:
317
  line += word + " "
318
  else:
319
  lines.append(line.strip())
 
338
  # ========== ИНТЕРФЕЙС ==========
339
  checker = KDChecker()
340
 
341
+ # Используем CSS для улучшения вида
342
+ css = """
343
+ .file-upload { height: 100px !important; min-height: 100px !important; }
344
+ """
345
+
346
+ with gr.Blocks(title="КД Checker", theme=gr.themes.Soft(), css=css) as app:
347
  gr.Markdown("# ✅ Генератор чек-листов КД")
348
 
349
  with gr.Row():
350
+ # Левая колонка - База
351
+ with gr.Column(scale=1):
352
+ gr.Markdown("### 1. База знаний")
353
+ # height=100 - исправляет гигантский размер
354
+ db_input = gr.File(label="Excel (.xlsx)", file_types=[".xlsx", ".xls"], type="filepath", height=100)
355
+ db_status = gr.Textbox(label="Статус базы", lines=3, interactive=False)
356
+ cabinet_dd = gr.Dropdown(label="Выбрать шкаф вручную (если авто не сработал)", choices=[], interactive=True)
357
 
358
+ # Правая колонка - Чертежи
359
+ with gr.Column(scale=1):
360
+ gr.Markdown("### 2. Проверка чертежей")
361
+ # height=100 - исправляет гигантский размер
362
+ pdf_input = gr.File(label="Загрузить PDF чертежи", file_count="multiple", file_types=[".pdf"], type="filepath", height=100)
363
+ run_btn = gr.Button("🔍 Сформировать чек-лист", variant="primary", size="lg")
364
+
365
+ # Нижняя секция - Результат
366
+ gr.Markdown("### 3. Результат")
367
  with gr.Row():
368
+ with gr.Column(scale=1):
369
+ result_txt = gr.Textbox(label="Лог проверки", lines=5)
370
+ with gr.Column(scale=1):
371
+ result_pdf = gr.File(label="📥 Скачать PDF")
372
 
373
+ # Логика
374
  db_input.change(checker.load_excel_db, [db_input], [db_status, cabinet_dd])
375
  run_btn.click(checker.check_files, [pdf_input, cabinet_dd], [result_txt, result_pdf])
376