Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -78,7 +78,9 @@ class KDChecker:
|
|
| 78 |
text = ""
|
| 79 |
try:
|
| 80 |
with pdfplumber.open(pdf_path) as pdf:
|
| 81 |
-
|
|
|
|
|
|
|
| 82 |
text += (page.extract_text() or "") + "\n"
|
| 83 |
except Exception as e:
|
| 84 |
print(f"Ошибка чтения PDF {pdf_path}: {e}")
|
|
@@ -162,32 +164,30 @@ class KDChecker:
|
|
| 162 |
found_by_method = "manual"
|
| 163 |
is_manual = True
|
| 164 |
else:
|
| 165 |
-
|
| 166 |
-
for file_path in progress.tqdm(files, desc="Чтение PDF"):
|
| 167 |
-
all_pdf_text += self.extract_text(file_path) + "\n"
|
| 168 |
-
|
| 169 |
-
pdf_numbers = self.find_all_decimal_numbers(all_pdf_text)
|
| 170 |
-
print(f"Найдено номеров: {pdf_numbers}")
|
| 171 |
-
|
| 172 |
db_clean_keys = set(self.excel_db["Cabinet_Clean"].tolist())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 173 |
|
| 174 |
-
|
| 175 |
-
if cand in db_clean_keys:
|
| 176 |
-
detected_cabinet = cand
|
| 177 |
-
found_by_method = "number"
|
| 178 |
-
break
|
| 179 |
-
|
| 180 |
if detected_cabinet == "Не определен":
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
if len(sub_name) < 5: continue
|
| 186 |
-
if sub_name.lower() in all_pdf_text.lower():
|
| 187 |
-
detected_cabinet = cab_name
|
| 188 |
-
found_by_method = "name"
|
| 189 |
-
break
|
| 190 |
-
if found_by_method == "name": break
|
| 191 |
|
| 192 |
print(f"Определен шкаф: {detected_cabinet}")
|
| 193 |
|
|
@@ -200,6 +200,7 @@ class KDChecker:
|
|
| 200 |
if not remarks:
|
| 201 |
return f"⚠️ Для шкафа '{detected_cabinet}' нет замечаний в базе.", None
|
| 202 |
|
|
|
|
| 203 |
processed_count = 0
|
| 204 |
for file_path in files:
|
| 205 |
fname = os.path.basename(file_path)
|
|
@@ -233,24 +234,19 @@ class KDChecker:
|
|
| 233 |
form = c.acroForm
|
| 234 |
width, height = A4
|
| 235 |
|
| 236 |
-
# --- ШРИФТЫ
|
| 237 |
font_name = 'Helvetica'
|
| 238 |
-
# На HF файл должен лежать в корне рядом с app.py
|
| 239 |
local_font = "arial.ttf"
|
| 240 |
|
| 241 |
try:
|
| 242 |
-
# Сначала ищем локальный файл (который вы должны загрузить на HF)
|
| 243 |
if os.path.exists(local_font):
|
| 244 |
pdfmetrics.registerFont(TTFont('Arial', local_font))
|
| 245 |
font_name = 'Arial'
|
| 246 |
-
# Затем пробуем системный (для Windows тестов)
|
| 247 |
elif os.path.exists("C:\\Windows\\Fonts\\arial.ttf"):
|
| 248 |
pdfmetrics.registerFont(TTFont('Arial', "C:\\Windows\\Fonts\\arial.ttf"))
|
| 249 |
font_name = 'Arial'
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
except Exception as e:
|
| 253 |
-
print(f"Ошибка шрифт��: {e}")
|
| 254 |
|
| 255 |
y = height - 50
|
| 256 |
c.setFont(font_name, 16)
|
|
@@ -316,7 +312,7 @@ class KDChecker:
|
|
| 316 |
return path
|
| 317 |
|
| 318 |
|
| 319 |
-
# ---
|
| 320 |
|
| 321 |
css = """
|
| 322 |
.gradio-container { max-width: 95% !important; }
|
|
@@ -329,9 +325,6 @@ footer { display: none !important; }
|
|
| 329 |
def create_app():
|
| 330 |
checker = KDChecker()
|
| 331 |
|
| 332 |
-
# Чтобы исправить warning, убираем css и theme отсюда, если версия gradio очень новая,
|
| 333 |
-
# НО для Hugging Face обычно лучше оставить здесь для предпросмотра.
|
| 334 |
-
# Если все еще ругается - перенесем в launch.
|
| 335 |
with gr.Blocks(title="Генератор чек-листов КД") as app:
|
| 336 |
gr.Markdown("## ✅ Генератор чек-листов КД")
|
| 337 |
|
|
@@ -361,14 +354,6 @@ def create_app():
|
|
| 361 |
|
| 362 |
return app
|
| 363 |
|
| 364 |
-
# --- ЗАПУСК ДЛЯ HUGGING FACE ---
|
| 365 |
if __name__ == "__main__":
|
| 366 |
app = create_app()
|
| 367 |
-
|
| 368 |
-
# Мы передаем CSS и Theme сюда, чтобы убрать Warning
|
| 369 |
-
app.launch(
|
| 370 |
-
server_name="0.0.0.0", # Важно для Docker контейнеров
|
| 371 |
-
server_port=7860, # Стандартный порт HF
|
| 372 |
-
css=css, # Передали стили сюда
|
| 373 |
-
theme=gr.themes.Soft() # Передали тему сюда
|
| 374 |
-
)
|
|
|
|
| 78 |
text = ""
|
| 79 |
try:
|
| 80 |
with pdfplumber.open(pdf_path) as pdf:
|
| 81 |
+
# Читаем только первые 2 страницы для скорости, обычно номер там
|
| 82 |
+
# Если нужно читать весь файл - уберите [:2]
|
| 83 |
+
for page in pdf.pages[:5]:
|
| 84 |
text += (page.extract_text() or "") + "\n"
|
| 85 |
except Exception as e:
|
| 86 |
print(f"Ошибка чтения PDF {pdf_path}: {e}")
|
|
|
|
| 164 |
found_by_method = "manual"
|
| 165 |
is_manual = True
|
| 166 |
else:
|
| 167 |
+
# === ОПТИМИЗАЦИЯ: Читаем файлы по очереди и прерываемся, если нашли ===
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 168 |
db_clean_keys = set(self.excel_db["Cabinet_Clean"].tolist())
|
| 169 |
+
|
| 170 |
+
for file_path in progress.tqdm(files, desc="Поиск номера шкафа"):
|
| 171 |
+
text = self.extract_text(file_path)
|
| 172 |
+
pdf_numbers = self.find_all_decimal_numbers(text)
|
| 173 |
+
|
| 174 |
+
# Проверяем, есть ли найденные номера в базе
|
| 175 |
+
for cand in pdf_numbers:
|
| 176 |
+
if cand in db_clean_keys:
|
| 177 |
+
detected_cabinet = cand
|
| 178 |
+
found_by_method = "number"
|
| 179 |
+
break # Прерываем поиск по номерам в текущем файле
|
| 180 |
+
|
| 181 |
+
if found_by_method == "number":
|
| 182 |
+
print(f"✅ Шкаф найден в файле: {os.path.basename(file_path)}")
|
| 183 |
+
break # Прерываем чтение остальных файлов!
|
| 184 |
|
| 185 |
+
# Если по номерам не нашли, пробуем по имени (тоже не читаем все подряд)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 186 |
if detected_cabinet == "Не определен":
|
| 187 |
+
# Здесь сложнее, так как имя может быть в любом файле.
|
| 188 |
+
# Но если мы уже прочитали часть файлов и не нашли номер,
|
| 189 |
+
# скорее всего это ручной ввод.
|
| 190 |
+
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 191 |
|
| 192 |
print(f"Определен шкаф: {detected_cabinet}")
|
| 193 |
|
|
|
|
| 200 |
if not remarks:
|
| 201 |
return f"⚠️ Для шкафа '{detected_cabinet}' нет замечаний в базе.", None
|
| 202 |
|
| 203 |
+
# Формируем список задач (здесь уже не читаем PDF, только имена файлов)
|
| 204 |
processed_count = 0
|
| 205 |
for file_path in files:
|
| 206 |
fname = os.path.basename(file_path)
|
|
|
|
| 234 |
form = c.acroForm
|
| 235 |
width, height = A4
|
| 236 |
|
| 237 |
+
# --- ШРИФТЫ ---
|
| 238 |
font_name = 'Helvetica'
|
|
|
|
| 239 |
local_font = "arial.ttf"
|
| 240 |
|
| 241 |
try:
|
|
|
|
| 242 |
if os.path.exists(local_font):
|
| 243 |
pdfmetrics.registerFont(TTFont('Arial', local_font))
|
| 244 |
font_name = 'Arial'
|
|
|
|
| 245 |
elif os.path.exists("C:\\Windows\\Fonts\\arial.ttf"):
|
| 246 |
pdfmetrics.registerFont(TTFont('Arial', "C:\\Windows\\Fonts\\arial.ttf"))
|
| 247 |
font_name = 'Arial'
|
| 248 |
+
except:
|
| 249 |
+
pass
|
|
|
|
|
|
|
| 250 |
|
| 251 |
y = height - 50
|
| 252 |
c.setFont(font_name, 16)
|
|
|
|
| 312 |
return path
|
| 313 |
|
| 314 |
|
| 315 |
+
# --- ИНТЕРФЕЙС ---
|
| 316 |
|
| 317 |
css = """
|
| 318 |
.gradio-container { max-width: 95% !important; }
|
|
|
|
| 325 |
def create_app():
|
| 326 |
checker = KDChecker()
|
| 327 |
|
|
|
|
|
|
|
|
|
|
| 328 |
with gr.Blocks(title="Генератор чек-листов КД") as app:
|
| 329 |
gr.Markdown("## ✅ Генератор чек-листов КД")
|
| 330 |
|
|
|
|
| 354 |
|
| 355 |
return app
|
| 356 |
|
|
|
|
| 357 |
if __name__ == "__main__":
|
| 358 |
app = create_app()
|
| 359 |
+
app.launch(server_name="0.0.0.0", server_port=7860, css=css, theme=gr.themes.Soft())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|