python 连接打印机打印多行

0.了解到python连接打印机需要安装win32print,去官网查看https://github.com/mhammond/pywin32/releases

1.python的版本选择正确,下载成功后得到安装包,点击安装出现python version 3.5 required, which was not found in the registry

2.解决方法是新建一个python脚本,命名为 register.py,内容为:

import sys

from winreg import *

# tweak as necessary
version = sys.version[:3]
installpath = sys.prefix

regpath = "SOFTWARE\\Python\\Pythoncore\\%s\\" % (version)
installkey = "InstallPath"
pythonkey = "PythonPath"
pythonpath = "%s;%s\\Lib\\;%s\\DLLs\\" % (
    installpath, installpath, installpath
)


def RegisterPy():
    try:
        reg = OpenKey(HKEY_CURRENT_USER, regpath)
    except EnvironmentError as e:
        try:
            reg = CreateKey(HKEY_CURRENT_USER, regpath)
            SetValue(reg, installkey, REG_SZ, installpath)
            SetValue(reg, pythonkey, REG_SZ, pythonpath)
            CloseKey(reg)
        except:
            print("*** Unable to register!")
            return
        print("--- Python", version, "is now registered!")
        return
    if (QueryValue(reg, installkey) == installpath and
                QueryValue(reg, pythonkey) == pythonpath):
        CloseKey(reg)
        print("=== Python", version, "is already registered!")
        return
    CloseKey(reg)
    print("*** Unable to register!")
    print("*** You probably have another Python installation!")


if __name__ == "__main__":
    RegisterPy()

运行即可,显示成功!下一步。

3.连接打印机,当你想打印单行的时候可以这样直接将文本送入打印机

import os, sys
import win32print
# coding=utf-8 
printer_name = win32print.GetDefaultPrinter ()

if sys.version_info >= (3,):
  raw_data =bytes ("This is a test", "utf-8")
else:
  raw_data = "This is a test"

hPrinter = win32print.OpenPrinter (printer_name)
try:
  hJob = win32print.StartDocPrinter (hPrinter, 1, ("test of raw data", None, "RAW"))
  try:
    win32print.StartPagePrinter (hPrinter)
    win32print.WritePrinter (hPrinter, str_byte)
    # win32print.WritePrinter (hPrinter, raw_data+'hhh')
    win32print.EndPagePrinter (hPrinter)
  finally:
    win32print.EndDocPrinter (hPrinter)
finally:
  win32print.ClosePrinter (hPrinter)

保证打印机开机后,就可以打印了,差不多是这样的结果

但是我的需求是打印多行,所以尝试着用循环语句将字符扩充

import os, sys
import win32print
# coding=utf-8 
printer_name = win32print.GetDefaultPrinter ()
#
# raw_data could equally be raw PCL/PS read from
#  some print-to-file operation
#
# def get_Print(raw_data):
code_list=[1153000235,1153000236,1153000237]

if sys.version_info >= (3,):
  s_tp=''
  raw_data = "    computer\n    {}\n    it\n    lee\n"
  for co in code_list:
    # print(raw_data.format(co))
    s_tp=s_tp+raw_data.format(co)
  # print(s_tp)
  str_byte=bytes (s_tp, "utf-8")
  # print('this')
else:
  raw_data = "This is a test"

hPrinter = win32print.OpenPrinter (printer_name)
try:
  hJob = win32print.StartDocPrinter (hPrinter, 1, ("test of raw data", None, "RAW"))
  try:
    win32print.StartPagePrinter (hPrinter)
    win32print.WritePrinter (hPrinter, str_byte)
    # win32print.WritePrinter (hPrinter, raw_data+'hhh')
    win32print.EndPagePrinter (hPrinter)
  finally:
    win32print.EndDocPrinter (hPrinter)
finally:
  win32print.ClosePrinter (hPrinter)

但是打印出来的效果是

可以看到换行符'\n'在这里的作用是直接把行换到作用字符对应的下一行,本来我以为打印出来的是这样的

    computer
    1153000235
    it
    lee
    
    computer
    1153000236
    it
    lee

    computer
    1153000236
    it
    lee

但实际上是:

    computer
                1153000235
                              it
                                    lee
    
                                          computer
                                                      1153000236
                                                                    it
                                                                          lee

                                                                                computer
                                                                                            1153000236
                                                                                                          it
                                                                                                                lee

后面因为太宽,没打出来

在api里也没有找到换行符应该怎样处理

所以用了另一种思路,将文本送给word文档,然后再打印文档,用到python-docx库,没有的话可以直接用pip安装

# coding:utf-8
import win32print
import win32api
from docx import Document
from docx.shared import Inches

document = Document()

code_list=[1153000235,1153000236,1153000237]
for i in range(3):

    testName = "computer\n"+str(code_list[i])+"\n"+"IT\n"+"Lee"
    
    p_total = document.add_heading("", 2)
    r_total = p_total.add_run(testName)
    r_total.font.bold = True

    # document.add_picture(img_name, width=Inches(1.5))  # 向文档里添加图片

document.save("E:/test.docx")  # 保存文档
fn="E:/test.docx"
win32api.ShellExecute(0,'print',fn,win32print.GetDefaultPrinterW(),".",0)

得到了这样的

差不多就是这样子,个人觉得还是直接传字符的比较方便,等我再研究一下那个方法

猜你喜欢

转载自blog.csdn.net/baidu_36669549/article/details/106133885