Задать вопрос
  • Как делать удаленную печать на python?

    @ArtemMik Автор вопроса
    В каком месте я его не понимаю, зачем мне тратить время на тестовый код, если он будет абсолютно такой же? Я задал конкретный вопрос, чтобы мне рассказали в чем может быть проблема. Задание - это если бы я дал огрызок какого-то кода и написал доделайте, я задал вопрос, мне просто даже можно словами на него ответить, потому что я не нашел информацию, как можно решить мою проблему
    Написано
  • Как совместить два .pdf файла?

    @ArtemMik Автор вопроса
    dim5x, изменил немного логику кода, и заметил то, что функция то сама работает, запустил ее в ручном режиме тестово и все работает, но когда совмещаешь ее с основным кодом, то ошибка вновь появляется

    Код:

    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("Временный файл с повернутыми страницами удален.")
    Написано
  • Как совместить два .pdf файла?

    @ArtemMik Автор вопроса
    dim5x,

    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


    вот весь файл
    Написано
  • Как совместить два .pdf файла?

    @ArtemMik Автор вопроса
    Vindicar, да, писала нейронка, функция вызывается один раз, после всех действий которые ни как не влияют на эту функцию

    я пробовал запускать функцию в тестовом режиме отдельным файлом и все работает как надо (во всех файлах по одному пдфу, а не несколько), также пробовал крутить функцию которые вызывают ее, все равно тоже самое
    Написано
  • Как загрузить список фото на telegraph?

    @ArtemMik Автор вопроса
    там еще есть прикол в том, что бот работал 3 месяца, а потом перестал
    Написано
  • Как приветствовать ботом нового пользователя в тг канале?

    @ArtemMik Автор вопроса
    from aiogram.dispatcher.filters import ChatMemberUpdatedFilter
    ImportError: cannot import name 'ChatMemberUpdatedFilter' from 'aiogram.dispatcher.filters' (/Users/artem/Desktop/проект/lotteryBot/.venv/lib/python3.10/site-packages/aiogram/dispatcher/filters/__init__.py)
    Написано
  • Как получить дистанцию из GetLocatedRequest?

    @ArtemMik Автор вопроса
    if user.peer.distance == radius:
    AttributeError: 'PeerUser' object has no attribute 'distance'
  • Как реализовать бота с функцией люди рядом?

    @ArtemMik Автор вопроса
    maksam07, может Telethon попробовать? с ним оч хорошо работаю
  • Как реализовать бота с функцией люди рядом?

    @ArtemMik Автор вопроса
    maksam07, тоже так подумал, но в оф канале aiogram говорят, что возможно, ищу людей кто шарит за это
  • Почему не работает форма регистрации Django?

    @ArtemMik Автор вопроса
    у меня в дальшем там будет форма для авторизации и формы будут одинаковые, можно условием будет проверить какая кнопка нажата и в дальнейшем уже делать действия кодом
  • Возможно ли засунуть django в сайт написанный на bitrix 1c?

    @ArtemMik Автор вопроса
    Алексей Уколов, я на этом проекте никто,дали задание осуществить такую систему на django
  • Возможно ли засунуть django в сайт написанный на bitrix 1c?

    @ArtemMik Автор вопроса
    Там просто нужна будет страничка с подбором холодильного оборудования с формой django и я пытаюсь придумать как можно реализовать такую связь
  • Как получить координаты предмета на скриншоте?

    @ArtemMik Автор вопроса
    Vindicar, команда для наводки есть, но я не понимаю как мне сделать, чтобы игра не сворачивалась и курсор мыши в ней наводился
  • Как получить координаты предмета на скриншоте?

    @ArtemMik Автор вопроса
    Vindicar, вопрос в том, как мне не сворачивая игру найти предмет и курсором мыши передвинуться на этот предмет
  • Как float данные из БД добавить в массив и найти самое близкое число к числу из БД?

    @ArtemMik Автор вопроса
    Artem Mikhniuk, Пояснение, если я записываю туда число (а не переменную), то выдаёт нужное значение, подскажите, как туда записать переменную с числом
  • Как float данные из БД добавить в массив и найти самое близкое число к числу из БД?

    @ArtemMik Автор вопроса
    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 - наше заданное число
  • Как передать state в другой handler?

    @ArtemMik Автор вопроса
    febday, спасибо, не подумал по началу