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

Рейтинг: 0Ответов: 1Опубликовано: 08.08.2025

У меня есть функция, которая хранится в файле на сервере, принтер подключен к серверу, я пытаюсь сделать авто печать .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:

    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)
    

    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)

    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:

    try:

        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} не найден"


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

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

        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 страниц)")
        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_file = r"D:\Zip24AutoPassport\ШУ_5249_51088.pdf"

    result = print_pdf_file(pdf_file)

    print("\nРезультат печати:")
    print("=" * 50)
    print(result)
    print("=" * 50)

Ответы

▲ 1

Решил свою проблему сменой дефолтного принтера на нужный

win32print.SetDefaultPrinterW(name)
win32print.SetDefaultPrinter(name)