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