Задать вопрос
@ArtemMik
Python

Как делать удаленную печать на python?

У меня есть функция, которая хранится в файле на сервере, принтер подключен к серверу, я пытаюсь сделать авто печать .pdf документа удаленно, когда я запускаю файл, то пишет что все ок

Вывод из консоли:
Созданы временные файлы:
- Обычные страницы: D:\Zip24AutoPassport\print_temp\ШУ_5249_51088_normal_20250808_104706.pdf
- Для буклета: D:\Zip24AutoPassport\print_temp\ШУ_5249_51088_booklet_20250808_104706.pdf
Отправка на печать страниц 1-2...
Отправка на печать буклета (страницы 3-end)...
Временные файлы сохранены в: D:\Zip24AutoPassport\print_temp

Результат печати:
==================================================
Печать отправлена:
- Обычные страницы: ШУ_5249_51088_normal_20250808_104706.pdf
- Буклет: ШУ_5249_51088_booklet_20250808_104706.pdf
==================================================

далее у меня просто открывается adobe acrobat и печать не происходит
В adobe acrobat принтер доступен и если вручную запустить печать то все работает, также если запустить данный код на компе который напрямую подключен к принтеру то печать происходит

Код:
import win32print
import win32api
import os
import time
from PyPDF2 import PdfReader, PdfWriter
from datetime import datetime

def prepare_pdf_parts(pdf_path: str, output_folder: str = None) -> tuple:
    """
    Разделяет PDF на две части:
    - Страницы 1-2 (обычная печать)
    - Страницы 3-end (для буклета)
    Возвращает пути к созданным файлам
    """
    if output_folder is None:
        output_folder = os.path.join(os.path.dirname(pdf_path), "print_temp")
        os.makedirs(output_folder, exist_ok=True)
    
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    base_name = os.path.splitext(os.path.basename(pdf_path))[0]
    
    normal_path = os.path.join(output_folder, f"{base_name}_normal_{timestamp}.pdf")
    booklet_path = os.path.join(output_folder, f"{base_name}_booklet_{timestamp}.pdf")

    reader = PdfReader(pdf_path)
    
    # Часть 1: Страницы 1-2 (обычная печать)
    writer_normal = PdfWriter()
    for i in range(min(2, len(reader.pages))):
        writer_normal.add_page(reader.pages[i])
    with open(normal_path, 'wb') as f:
        writer_normal.write(f)
    
    # Часть 2: Страницы 3-end (буклет)
    if len(reader.pages) > 2:
        writer_booklet = PdfWriter()
        for i in range(2, len(reader.pages)):
            writer_booklet.add_page(reader.pages[i])
        with open(booklet_path, 'wb') as f:
            writer_booklet.write(f)
    else:
        booklet_path = None
    
    return normal_path, booklet_path

def print_pdf_file(pdf_path: str, printer_name: str = "Kyocera ECOSYS P3145dn KX", keep_temp_files: bool = True) -> str:
    """
    Печатает PDF с разными настройками для разных страниц
    :param keep_temp_files: если True - файлы не удаляются после печати
    """
    try:
        # 1. Проверки
        if not os.path.exists(pdf_path):
            return f"Файл не найден: {pdf_path}"
        
        if not pdf_path.lower().endswith('.pdf'):
            return "Только PDF-файлы поддерживаются"

        printers = win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL | win32print.PRINTER_ENUM_CONNECTIONS)
        if not any(printer[2] == printer_name for printer in printers):
            return f"Принтер {printer_name} не найден"

        # 2. Подготовка временных файлов
        normal_path, booklet_path = prepare_pdf_parts(pdf_path)
        print(f"Созданы временные файлы:\n- Обычные страницы: {normal_path}\n- Для буклета: {booklet_path}")

        # 3. Печать обычных страниц
        print("Отправка на печать страниц 1-2...")
        win32api.ShellExecute(
            0,
            "print",
            normal_path,
            f'/d:"{printer_name}"',
            None,
            0
        )
        time.sleep(3)

        # 4. Печать буклета (если есть страницы)
        if booklet_path:
            print("Отправка на печать буклета (страницы 3-end)...")
            win32api.ShellExecute(
                0,
                "print",
                booklet_path,
                f'/d:"{printer_name}" /BOOKLET',
                None,
                0
            )
            time.sleep(3)
        else:
            print("Нет страниц для буклета (файл менее 3 страниц)")

        # 5. Удаление временных файлов (если не нужно сохранять)
        if not keep_temp_files:
            time.sleep(5)
            os.unlink(normal_path)
            if booklet_path:
                os.unlink(booklet_path)
            print("Временные файлы удалены")
        else:
            print(f"Временные файлы сохранены в: {os.path.dirname(normal_path)}")

        return ("Печать отправлена:\n"
               f"- Обычные страницы: {os.path.basename(normal_path)}\n"
               f"- Буклет: {os.path.basename(booklet_path) if booklet_path else 'нет'}")

    except Exception as e:
        return f"Ошибка: {str(e)}"



if __name__ == "__main__":
    # Укажите путь к вашему PDF-файлу
    pdf_file = r"D:\Zip24AutoPassport\ШУ_5249_51088.pdf"  # Замените на реальный путь

    # Можно указать конкретный принтер или оставить по умолчанию
    result = print_pdf_file(pdf_file)

    print("\nРезультат печати:")
    print("=" * 50)
    print(result)
    print("=" * 50)
  • Вопрос задан
  • 48 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Everything_is_bad
Не нужно сюда прибегать с кодом от чатгпт, либо его дальше мучай, чтобы он тебе исправил, либо пиши сам. Это уже не первый вопрос от тебя, где код написан чатгпт, но ты не понимаешь как он работает и просишь, чтобы за тебя сделали работы. Это задание, а не вопрос.
Ответ написан
@ArtemMik Автор вопроса
Python
Решил свою проблему сменой дефолтного принтера на нужный

win32print.SetDefaultPrinterW(name)
win32print.SetDefaultPrinter(name)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы