Печать на 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.