Печать на Python без печати на конкретный принтер

У меня есть документ PDF, и я хочу его распечатать с помощью своего приложения python.

Я попробовал решение в здесь (распечатать документ PDF с помощью модуля win32print python?), но когда я устанавливаю Ghostscript 9.15, который является фактической версией, он не имеет gsprint.exe

То, как я использую эту работу, - это команда os.startfile('PDFfile.pdf', "print"), но она открывает средство просмотра по умолчанию (мое - Adobe Reader), и после того, как печать была открыта, попытка убить процесс с помощью os.system("TASKKILL /F /IM AcroRD32.exe") убивает другие открытые окна, а я не хочу этого.

При следующей команде он также печатает, но он также позволяет открывать Adobe Reader

currentprinter = win32print.GetDefaultPrinter()
win32api.ShellExecute(0, "print", 'PDFfile.pdf', '/d:"%s"' % currentprinter, ".", 0)

Я видел этот ответ, но они рекомендуют снова использовать gsprint.exe

У кого-нибудь есть файл gsprint.exe или любое другое решение?

ПРИМЕЧАНИЕ.. Когда я использовал другую программу по умолчанию для открытия PDF файлов, таких как Chrome или Windows Reader, я всегда получаю исключение при выполнении команд выше '(31, 'ShellExecute', 'A device attached to the system is not functioning.')' или [Error 1155] No application is associated with the specified file for this operation: 'PDFfile.pdf' с помощью startfile команда

Ответ 1

Наконец после часа и часов поиска правильных файлов я нашел ответ на свою проблему.

Вы можете загрузить GSPRINT в ЗДЕСЬ

Вы можете загрузить Ghostscript GPL в ЗДЕСЬ

С помощью этих извлеченных файлов на вашем ПК (Windows) вы можете распечатать PDF с помощью этой команды

GHOSTSCRIPT_PATH = "C:\\path\\to\\GHOSTSCRIPT\\bin\\gswin32.exe"
GSPRINT_PATH = "C:\\path\\to\\GSPRINT\\gsprint.exe"

# YOU CAN PUT HERE THE NAME OF YOUR SPECIFIC PRINTER INSTEAD OF DEFAULT
currentprinter = win32print.GetDefaultPrinter()

win32api.ShellExecute(0, 'open', GSPRINT_PATH, '-ghostscript "'+GHOSTSCRIPT_PATH+'" -printer "'+currentprinter+'" "PDFFile.pdf"', '.', 0)

GhostScript также можно найти на официальной странице ЗДЕСЬ

Я нашел gsprint.exe для 64 бит ЗДЕСЬ

Надеюсь, это поможет.

Ответ 2

Здесь можно тихо печатать pdf в том же каталоге, что и ваш скрипт python без gsprint и без win32api. Это позволяет больше настраивать GhostScript, например, выбирать ширину/высоту и т.д.

import os
import subprocess
import sys

if sys.platform == 'win32':
    args = '"C:\\\\Program Files\\\\gs\\\\gs9.23\\\\bin\\\\gswin64c" ' \
           '-sDEVICE=mswinpr2 ' \
           '-dBATCH ' \
           '-dNOPAUSE ' \
           '-dFitPage ' \
           '-sOutputFile="%printer%myPrinterName" '
    ghostscript = args + os.path.join(os.getcwd(), 'myFile.pdf').replace('\\', '\\\\')
    subprocess.call(ghostscript, shell=True)

Если вы используете 32-битную версию GhostScript, вы можете использовать gswin32c

Ответ 3

Если вы хотите распечатать определенные страницы и некоторые другие параметры, вы должны указать их в параметрах gsprint следующим образом:

import win32print
import win32api

GHOSTSCRIPT_PATH = "C:\\path\\to\\GHOSTSCRIPT\\bin\\gswin32.exe"
GSPRINT_PATH = "C:\\path\\to\\GSPRINT\\gsprint.exe"

params = '-ghostscript "'+ GHOSTSCRIPT_PATH  +'" -printer "'+currentprinter+'" -from 1 -to 3 -landscape -copies 1 "1.pdf "'
print(params)

win32api.ShellExecute(0, 'open', GSPRINT_PATH, params, '.',0)

Ответ 4

Следующий код заблокирует текущую задачу

for i in range(10):
    currentprinter = win32print.GetDefaultPrinter()
    win32api.ShellExecute(0, "print", 'PDFfile.pdf', '/d:"%s"' % currentprinter, ".", 0)

и уничтожение читателя после печати справки не заблокирует текущее задание

os.system("TASKKILL /F /IM AcroRD32.exe") 

но он закроет и другие файлы PDF.

Если вы не можете использовать gsprint, используйте команду acrobat

import win32print
import subprocess
import time
pdf_file  = 'D:\d1\d1.pdf'
acrobat = 'C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe'
name = win32print.GetDefaultPrinter()
cmd = '"{}" /n /h /s /o  /t "{}" "{}"'.format(acrobat, pdf_file, name)
for i in range(10)):
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Он не заблокирует текущую задачу и не закроет другие файлы PDF.