0

在我工作的组织中,不同的打印机设置在不同的位置。都主要用于打印A4大小的文档,所以默认设置相应。

我们还使用了一堆自定义大小的表格,到目前为止人们一直在手工填写。最近,我的任务是从我们的中央数据库为上述表格设置打印自动化。

我正在使用 reportlab 创建临时 pdf 文件,然后尝试将其发送到默认打印机。一切都相对简单,除了让打印机注册自定义纸张尺寸。

我得到了以下代码片段,但我真的被卡住了。

import tempfile
import win32api
import win32print

pdf_file = tempfile.mktemp(".pdf")

#CREATION OF PDF FILE WITH REPORTLAB

printer = win32print.GetDefaultPrinter()
PRINTER_DEFAULTS = {"DesiredAccess":win32print.PRINTER_ALL_ACCESS}
pHandle = win32print.OpenPrinter(printer, PRINTER_DEFAULTS)
level = 2
properties = win32print.GetPrinter(pHandle, level)
pDevModeObj = properties["pDevMode"]

pDevModeObj.PaperSize = 0
pDevModeObj.PaperLength = 2200 #SIZE IN 1/10 mm
pDevModeObj.PaperWidth = 1000 #SIZE IN 1/10 mm

properties["pDevMode"]=pDevModeObj
win32print.SetPrinter(pHandle,level,properties,0)
    
#OPTION ONE
#win32api.ShellExecute(0, "print", pdf_file, None, ".", 0)

#OPTION TWO
win32api.ShellExecute (0,"printto",pdf_file,'"%s"' % printer,".",0)

win32print.ClosePrinter(pHandle)

它只是行不通。打印机不会报告“纸张尺寸不匹配”,就像在向他们发送非 A4 文档时应该报告的那样。当我尝试打印到 PDF 打印机时,它也默认为 A4。

打电话时

print(pDevModeObj.PaperSize)
print(pDevModeObj.PaperLength)
print(pDevModeObj.PaperWidth)

一切似乎都井井有条,所以我猜我不知道如何将这些纸张尺寸值发送回打印机设置。

这是我签出的所有资源的列表(示例并非全部在 python 中,还有一些没有使用 win32api),但无法正常工作:

4

1 回答 1

1

ShellExecute正在使用默认打印参数。如果需要使用重置DevMode进行打印,可以使用CreateDC.

参考:GDI 打印 API


如果使用 SetPrinter 修改打印机的默认 DEVMODE 结构(全局设置打印机默认值),则必须首先调用DocumentProperties函数来验证 DEVMODE 结构。

参考:

也可以直接DocumentProperties用来修改打印机初始化信息。

然后传递pDevModeObjCreateDC, 并使用StartDocStartPage打印。

类似案例:用 pywin32 更换打印机托盘

于 2020-11-17T03:57:21.360 回答