Python在Brother激光打印机上打印pdf文件(打开/关闭双面打印)

时间:2015-03-18 09:43:49

标签: python printing duplex

我想编写一个python脚本,在我的激光打印机上打印文件夹中的每个文件。 应该可以打开和关闭双面打印模式。 通过文件名称进行解除。如果文件名前面有D,则它是双工,如果有S,则它是单工。 到目前为止我还没有实现。

我的问题是如何告诉打印机使用双工模式?

这是我的代码

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 个答案:

答案 0 :(得分: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提到您可以在第3行使用PRINTER_ACCESS_MANAGE_LIMITED,但win32print没有更多限制(但基本上只需要)全局变量。因此,您需要完整访问权限。

请注意,您还可以print using win32print,从而避免使用subprocess.call或"炮轰"使用win32api

显然,这仅适用于MS Windows。

配置好打印机后,例如在双工模式下,您可以向其发送标记为双面打印作业的所有文档的列表。然后,您可以完全类似于上面的代码更改设置,并对Simplex队列执行相同的操作。