from docx import Document
from config import word_path
import os
import re
from config import *
from docx.shared import Inches
from docx import Document
from pdf2docx import Converter
from docx.shared import Inches
import tempfile
from pathlib import Path
from datetime import datetime
from docx.enum.style import WD_STYLE_TYPE
from docx2pdf import convert
import aspose.words as aw
import fitz
from PyPDF2 import PdfReader, PdfWriter
import shutil
from electro import insert_docx_into_docx
def process_pdf_attachment(electro_path, passports_path):
FILES_DIR = Path(__file__).parent / 'files'
FILES_DIR.mkdir(exist_ok=True)
temp_filename = f"temp_{os.path.basename(electro_path).replace('.pdf', '')}.docx"
temp_docx_path = str(FILES_DIR / temp_filename)
temp_pdf_folder = Path(passports_path).parent / "Passports_temp"
try:
# Конвертируем PDF в DOCX
if not convert_docx_to_pdf(passports_path, temp_pdf_folder, electro_path):
return False
if not insert_docx_into_docx(electro_path, temp_pdf_folder, passports_path):
return False
# Вставляем во временный DOCX в основной документ
print(f"Временный файл сохранен в: {temp_docx_path}")
return True
except Exception as e:
print(f"Ошибка при обработке PDF: {str(e)}")
return False
def convert_docx_to_pdf(passports_path, temp_pdf_folder, electro_path):
"""
Конвертирует DOCX в PDF, удаляет исходные DOCX файлы после успешной конвертации
и перемещает все PDF в папку Passports_temp рядом с исходной папкой
:param passports_path: Путь к папке с документами
:return: Кортеж (количество конвертированных файлов, количество удаленных файлов)
"""
try:
folder_path = Path(passports_path)
print(f"Обрабатываемая папка: {folder_path}")
if not folder_path.exists():
print(f"Папка не найдена: {passports_path}")
return (0, 0)
temp_pdf_folder.mkdir(exist_ok=True)
print(f"Создана временная папка: {temp_pdf_folder}")
success_count = 0
deleted_count = 0
for docx_file in folder_path.glob('*.docx'):
pdf_path = folder_path / f"{docx_file.stem}.pdf"
print(f"\nОбработка: {docx_file.name}")
try:
doc = aw.Document(str(docx_file))
doc.save(str(pdf_path))
if pdf_path.exists():
print(f"✓ PDF создан: {pdf_path.name}")
success_count += 1
# Удаление DOCX после успешной конвертации
try:
os.remove(docx_file)
print(f"️ Удален исходный файл: {docx_file.name}")
deleted_count += 1
except Exception as delete_error:
print(f"× Ошибка при удалении {docx_file.name}: {str(delete_error)}")
else:
print(f"× PDF не создан для: {docx_file.name}")
except Exception as convert_error:
print(f"× Ошибка конвертации {docx_file.name}: {str(convert_error)}")
continue
# Перемещаем все PDF файлы во временную папку
pdf_files = list(folder_path.glob('*.pdf'))
moved_count = 0
for pdf_file in pdf_files:
try:
target_path = temp_pdf_folder / pdf_file.name
shutil.move(str(pdf_file), str(target_path))
moved_count += 1
print(f"⇨ Перемещен PDF: {pdf_file.name} → {target_path}")
except Exception as move_error:
print(f"× Ошибка при перемещении {pdf_file.name}: {str(move_error)}")
print(f"\nИтог:")
print(f"- Успешно конвертировано: {success_count} файлов")
print(f"- Удалено исходных DOCX: {deleted_count} файлов")
print(f"- Перемещено PDF в {temp_pdf_folder.name}: {moved_count} файлов")
return (success_count, deleted_count)
except Exception as e:
print(f"Критическая ошибка: {str(e)}")
return (0, 0)
def insert_docx_into_docx(electro_path, temp_pdf_folder, passports_path):
"""
Обрабатывает PDF файлы по одному:
1. Добавляет схемы из electro_path
2. Перемещает в папку Паспорта
3. Удаляет из временной папки
"""
with tempfile.NamedTemporaryFile(suffix='.pdf', delete=False) as temp_file:
temp_path = temp_file.name
# Поворачиваем страницы исходного PDF и сохраняем во временный файл
with open(electro_path, 'rb') as original_add_file:
pdf_to_rotate = PdfReader(original_add_file)
writer = PdfWriter()
for page in pdf_to_rotate.pages:
page.rotate(-90)
writer.add_page(page)
writer.write(temp_file)
try:
# Получаем список PDF-файлов в папке
pdf_files = [f for f in os.listdir(temp_pdf_folder) if f.lower().endswith('.pdf')]
if not pdf_files:
print(f"В папке {temp_pdf_folder} не найдено PDF-файлов.")
return False
print(f"Найдено {len(pdf_files)} PDF-файлов для обработки.")
# Читаем повернутый временный PDF
with open(temp_path, 'rb') as rotated_file:
rotated_pdf = PdfReader(rotated_file)
for pdf_file in pdf_files:
input_path = os.path.join(temp_pdf_folder, pdf_file)
output_path = os.path.join(passports_path, pdf_file)
print(f"\nНачинаем обработку файла: {pdf_file}")
# Создаем новый PDF с добавленными схемами
writer = PdfWriter()
try:
# Добавляем оригинальные страницы
with open(input_path, 'rb') as original_file:
original_pdf = PdfReader(original_file)
for page in original_pdf.pages:
writer.add_page(page)
# Добавляем повернутые страницы схем
for page in rotated_pdf.pages:
writer.add_page(page)
# Сохраняем результат в папку Паспорта
with open(output_path, 'wb') as output_file:
writer.write(output_file)
print(f"✓ Файл {pdf_file} успешно обработан")
# Удаляем исходный файл из временной папки
try:
os.remove(input_path)
print(f"️ Файл {pdf_file} удален из временной папки")
except Exception as delete_error:
print(f"× Ошибка при удалении {pdf_file}: {str(delete_error)}")
continue
except Exception as file_error:
print(f"× Ошибка при обработке файла {pdf_file}: {str(file_error)}")
continue
print("\nОбработка всех файлов завершена!")
return True
finally:
# Удаляем временный файл
os.unlink(temp_path)
print("Временный файл с повернутыми страницами удален.")
from docx import Document
from config import word_path
import os
import re
from config import *
from docx.shared import Inches
from docx import Document
from pdf2docx import Converter
from docx.shared import Inches
import tempfile
from pathlib import Path
from datetime import datetime
from docx.enum.style import WD_STYLE_TYPE
from docx2pdf import convert
import aspose.words as aw
import fitz
def find_pdf_in_electrika(project_folder):
"""Поиск PDF файла в папке электрика"""
elektrika_path = os.path.join(project_folder, "электрика")
try:
if not os.path.exists(elektrika_path):
print(f"Папка 'электрика' не найдена в {project_folder}")
return None
# Ищем PDF файлы, начинающиеся на цифру 1
pdf_files = [f for f in os.listdir(elektrika_path)
if f.lower().endswith('.pdf') and f.startswith('1')]
if pdf_files:
# Сортируем по имени и берем первый
pdf_files.sort()
pdf_name = pdf_files[0]
pdf_path = os.path.join(elektrika_path, pdf_name)
print(f"Найден PDF файл: {pdf_name}")
return pdf_path
else:
print("PDF файлы, начинающиеся на '1', не найдены")
print(f"Содержимое папки: {os.listdir(elektrika_path)}")
return None
except Exception as e:
print(f"Ошибка при поиске PDF: {str(e)}")
return None
def find_project_folder(project_number):
"""Поиск папки проекта на рабочем столе"""
try:
if not os.path.exists(desktop_path):
print(f"Папка {desktop_path} не найдена")
return None
# Улучшенный шаблон для поиска папок
pattern = re.compile(r".*ШУ\s*" + re.escape(str(project_number)) + r"\D*$", re.IGNORECASE)
matching_folders = []
for folder_name in os.listdir(desktop_path):
if pattern.search(folder_name):
matching_folders.append(folder_name)
if matching_folders:
# Выбираем самую "свежую" папку (по дате в названии)
matching_folders.sort(reverse=True)
folder_path = os.path.join(desktop_path, matching_folders[0])
print(f"Найдена папка проекта: {folder_path}")
# Ищем PDF в подпапке электрика
pdf_file = find_pdf_in_electrika(folder_path)
return folder_path, pdf_file # Возвращаем оба значения
else:
print(f"Папка для проекта ШУ {project_number} не найдена")
return None, None
except Exception as e:
print(f"Ошибка при поиске папки проекта: {str(e)}")
return None, None
FILES_DIR = Path(__file__).parent / 'files'
FILES_DIR.mkdir(exist_ok=True)
def process_pdf_attachment(electro_path, passports_path):
"""Обрабатывает и вставляет PDF в основной документ"""
# Создаем уникальное имя временного файла
temp_filename = f"temp_{os.path.basename(electro_path).replace('.pdf', '')}.docx"
temp_docx_path = str(FILES_DIR / temp_filename)
try:
# Конвертируем PDF в DOCX
if not convert_docx_to_pdf(passports_path):
return False
# Вставляем во временный DOCX в основной документ
if not insert_docx_into_docx(electro_path, passports_path):
return False
print(f"Временный файл сохранен в: {temp_docx_path}")
return True
except Exception as e:
print(f"Ошибка при обработке PDF: {str(e)}")
return False
def convert_docx_to_pdf(passports_path):
"""
Конвертирует DOCX в PDF и удаляет исходные DOCX файлы после успешной конвертации
:param passports_path: Путь к папке с документами
:return: Кортеж (количество конвертированных файлов, количество удаленных файлов)
"""
try:
folder_path = Path(passports_path)
print(f"Обрабатываемая папка: {folder_path}")
if not folder_path.exists():
print(f"Папка не найдена: {passports_path}")
return (0, 0)
success_count = 0
deleted_count = 0
for docx_file in folder_path.glob('*.docx'):
pdf_path = folder_path / f"{docx_file.stem}.pdf"
print(f"\nОбработка: {docx_file.name}")
try:
# Конвертация в PDF
convert(str(docx_file), str(pdf_path))
if pdf_path.exists():
print(f"✓ PDF создан: {pdf_path.name}")
success_count += 1
# Удаление DOCX после успешной конвертации
try:
os.remove(docx_file)
print(f"️ Удален исходный файл: {docx_file.name}")
deleted_count += 1
except Exception as delete_error:
print(f"× Ошибка при удалении {docx_file.name}: {str(delete_error)}")
else:
print(f"× PDF не создан для: {docx_file.name}")
except Exception as convert_error:
print(f"× Ошибка конвертации {docx_file.name}: {str(convert_error)}")
continue
print(f"\nИтог:")
print(f"- Успешно конвертировано: {success_count} файлов")
print(f"- Удалено исходных DOCX: {deleted_count} файлов")
return (success_count, deleted_count)
except Exception as e:
print(f"Критическая ошибка: {str(e)}")
return (0, 0)
def insert_docx_into_docx(electro_path, passports_path):
"""
1. Поворачивает все страницы схемы PDF на -90 градусов и сохраняет как временный файл.
2. Вставляет эту схему ровно ОДИН раз в каждый паспорт PDF в указанной папке.
"""
try:
passports_folder = Path(passports_path)
schema_pdf = Path(electro_path)
if not passports_folder.exists():
print(f"❌ Папка с паспортами не найдена: {passports_folder}")
return False
if not schema_pdf.exists():
print(f"❌ Схема не найдена: {schema_pdf}")
return False
# Шаг 1: Создаем временный файл повернутой схемы
temp_schema_path = passports_folder / "__temp_rotated_schema__.pdf"
with fitz.open(schema_pdf) as original:
with fitz.open() as rotated:
for page in original:
# Поворачиваем каждую страницу на -90°
rotated_page = rotated.new_page(
width=page.rect.height,
height=page.rect.width
)
rotated_page.show_pdf_page(
rotated_page.rect,
original,
page.number,
rotate=-90
)
rotated.save(temp_schema_path)
print(f"✅ Временный файл схемы создан: {temp_schema_path.name}")
# Шаг 2: Вставляем схему в каждый паспорт
for passport_file in passports_folder.glob("ШУ_*.pdf"):
print(f"▶ Обработка паспорта: {passport_file.name}")
temp_output = passports_folder / f"__temp__{passport_file.name}"
try:
# Новый документ с копией паспорта
with fitz.open(passport_file) as passport_doc:
with fitz.open() as result:
result.insert_pdf(passport_doc)
with fitz.open(temp_schema_path) as schema_doc:
result.insert_pdf(schema_doc)
result.save(temp_output)
# Заменяем оригинал
passport_file.unlink()
temp_output.rename(passport_file)
print(f"✓ Добавлена схема в: {passport_file.name}")
except Exception as e:
print(f"⛔ Ошибка при вставке в {passport_file.name}: {e}")
if temp_output.exists():
temp_output.unlink()
# Удаляем временный файл схемы
if temp_schema_path.exists():
temp_schema_path.unlink()
print("️ Временный файл схемы удалён")
print("✅ Обработка завершена успешно")
return True
except Exception as e:
print(f"❌ Критическая ошибка: {e}")
return False
db.cur.execute('SELECT * FROM twoKM_Medium_temperature_refrigeration_unit_model ORDER BY ABS(сooling_capacity - cold_conductivity) ASC LIMIT 1')
data = db.cur.fetchall()
db.cur.execute('SELECT * FROM twoKM_Medium_temperature_refrigeration_unit_model ORDER BY ABS(сooling_capacity - cold_conductivity) ASC LIMIT 1')
sqlite3.OperationalError: no such column: cold_conductivity
#cold_conductivity - наше заданное число