2015-03-18 2 views
0

Я хочу написать скрипт python, который печатает каждый файл в папке на моем лазерном принтере. Должна быть предусмотрена возможность включения и выключения режима двусторонней печати. Деление производится по имени файла. Если перед именем файла есть D, это дуплекс, и если есть S, это симплекс. Это я не реализовал до сих пор.Python печать pdf-файла на моем принтере Brother Laser (двусторонняя печать вкл./Выкл.)

Моя проблема заключается в том, как сообщить принтеру использовать режим дуплекса?

Вот мой код

from os import path 
from os import listdir 
from os.path import isfile, join 
import win32api 
import win32print 

mypath = r"D:\\test" 

#list all the files in a folder 
files = [ f for f in listdir(mypath) if isfile(join(mypath,f)) ] 
print files 


for file in files: 
    file = mypath + "\\" + file 
## if "11x17" in file and "County" in file: 
    win32api.ShellExecute (
     0, 
     "print", 
     file, 
      # 
      # If this is None, the default printer will 
      # be used anyway. 
      # 
     '/d:"%s"' % win32print.GetDefaultPrinter(), 
     ".", 
     0 
     ) 

del files 
del mypath 

альтернативой было бы это (я должен добавить Петля для всех файлов)

from subprocess import call 

acrobat = "C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" ##  Acrobat reader would also work, apparently 
file = "D:\\Test\\test.pdf" 
printer = "gDoc Creator" 

call([acrobat, "/T", file, printer]) 

теперь я знаю, что это существует

#Lists properties and capabilities for all the printers installed on a computer. 
import win32com.client 
strComputer = "." 
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator") 
objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2") 
colItems = objSWbemServices.ExecQuery("Select * from Win32_PrinterConfiguration") 
for objItem in colItems: 
    print "Duplex: ", objItem.Duplex 

Это значение может получить TRUE и FALSE, но есть ли способ отправить его, когда я хочу печатать с помощью моего сценария?

Такс заранее за вашу помощь.

ответ

1

Вы можете настроить настройку дуплекса, изменив соответствующий атрибут объекта DevMode. Этот объект имеет другие общие атрибуты, такие как настройки цвета (черный & белый/цветной/..) и ориентация страницы (lanscape/портрет). Обратите внимание, что это лучше всего работает в операции Get/Set:

>>> import win32print 
>>> name = win32print.GetDefaultPrinter() # verify that it matches with the name of your printer 
>>> printdefaults = {"DesiredAccess": win32print.PRINTER_ALL_ACCESS} # Doesn't work with PRINTER_ACCESS_USE 
>>> handle = win32print.OpenPrinter(name, printdefaults) 
>>> level = 2 
>>> attributes = win32print.GetPrinter(handle, level) 
>>> attributes['pDevMode'].Duplex 
0 
>>> attributes['pDevMode'].Duplex = 1 
>>> win32print.SetPrinter(handle, level, attributes, 0) 
>>> win32print.GetPrinter(handle, level)['pDevMode'].Duplex 
1 

Хотя official Windows dev center documentation упоминает, что вы могли бы использовать PRINTER_ACCESS_MANAGE_LIMITED в строке 3, win32print не имеет этого более ограничены (но в основном все, что требуется) глобальная переменная, определенная , Таким образом, вам понадобится полный доступ.

Обратите внимание, что вы также можете print using win32print, тем самым избавляя вас от необходимости использовать subprocess.call или «обстреливать» с помощью win32api.

Очевидно, что это работает только под MS Windows.

После того, как вы настроили свой принтер, например. в дуплексном режиме вы можете отправить ему список всех документов, отмеченных для двусторонней печати. Затем вы можете изменить настройку, полностью аналогично приведенному выше коду, и сделать то же самое для очереди симплекса.

+0

У меня такая же проблема, что и MisterX, но я попытался с этим решением, включив режим Duplex в настройках принтера и через python я все еще не могу печатать в дуплексном режиме, каждая команда возвращает правильный код , но все же печатать два листа вместо одного двухстороннего листа ... Любые идеи? –

Смежные вопросы