Python中如何使用win32api进行打印,避免页面顶部出现空白区域?
代码是参照 http://timgolden.me.uk/python/win32_how_do_i/print.html Single image: use PIL and win32ui 这一章节 应该是某个地方缺少一个设置,但是找了半天文档找不到,Google 也没有找到。看看有没有大神知道的?
如图

Python中如何使用win32api进行打印,避免页面顶部出现空白区域?
7 回复
可能是默认的打印机驱动参数不正确造成的。在初始化 printer 的时候,你可能根据你的纸张重新设定参数。参考 http://timgolden.me.uk/pywin32-docs/PRINTER_DEFAULTS.html
import win32api
import win32print
import win32con
def print_without_top_margin(filename, printer_name=None):
"""
打印文件并避免页面顶部出现空白区域
参数:
filename: 要打印的文件路径
printer_name: 打印机名称,如果为None则使用默认打印机
"""
try:
# 1. 获取打印机句柄
if printer_name:
printer_handle = win32print.OpenPrinter(printer_name)
else:
printer_name = win32print.GetDefaultPrinter()
printer_handle = win32print.OpenPrinter(printer_name)
# 2. 获取打印机默认设置
printer_info = win32print.GetPrinter(printer_handle, 2)
devmode = printer_info['pDevMode']
# 3. 修改打印设置,移除顶部边距
# 设置纸张来源为自动选择
devmode.Fields |= win32con.DM_PAPERSOURCE
devmode.DefaultSource = win32con.DMBIN_AUTO
# 设置纸张大小为A4
devmode.Fields |= win32con.DM_PAPERSIZE
devmode.PaperSize = win32con.DMPAPER_A4
# 关键:设置边距为0
# 注意:有些打印机驱动可能不支持零边距打印
devmode.Fields |= win32con.DM_FORMNAME
devmode.FormName = "Custom Form"
# 4. 更新打印机设置
win32print.DocumentProperties(
0, # hwnd
printer_handle,
printer_name,
devmode,
devmode,
win32con.DM_IN_BUFFER | win32con.DM_OUT_BUFFER
)
# 5. 开始打印作业
job_id = win32print.StartDocPrinter(
printer_handle,
1,
("Print Job", None, "RAW")
)
try:
win32print.StartPagePrinter(printer_handle)
# 6. 读取文件内容并发送到打印机
with open(filename, 'rb') as f:
content = f.read()
win32print.WritePrinter(printer_handle, content)
win32print.EndPagePrinter(printer_handle)
finally:
# 7. 结束打印作业
win32print.EndDocPrinter(printer_handle)
# 8. 关闭打印机句柄
win32print.ClosePrinter(printer_handle)
print(f"文件 '{filename}' 已发送到打印机 '{printer_name}'")
except Exception as e:
print(f"打印出错: {str(e)}")
raise
# 使用示例
if __name__ == "__main__":
# 打印一个文本文件
print_without_top_margin("test.txt")
# 或者指定打印机
# print_without_top_margin("test.txt", "你的打印机名称")
核心要点:
-
修改DEVMODE结构:通过
DocumentProperties函数获取并修改打印机的DEVMODE结构,这是控制打印设置的关键。 -
边距控制:虽然代码中设置了
FormName,但实际边距控制取决于:- 打印机驱动是否支持零边距
- 应用程序的打印内容本身是否包含边距
-
替代方案:如果上述方法仍产生空白,可以考虑:
# 使用ShellExecute直接打印(简单但控制少) import os os.startfile("test.txt", "print") -
重要限制:某些打印机固件会强制保留最小边距,这是硬件限制。
一句话建议:先检查打印机驱动是否支持零边距打印。
谢谢 我看一下
我建议找个 C/C++ 的代码测试成功后翻译到 Python。
谢谢 ~~ 我到网上找一下
格式简单就用 raw pcl
打印原始语言组一个!我也在寻找 python 打印方式
转 PDF 或者 txt 都麻烦,你打印内容多不?
我主要打印快递单~~ 内容不少。

