0. Pythonがプリンターに接続するには、win32printをインストールする必要があることを学び、公式Webサイトにアクセスしてhttps://github.com/mhammond/pywin32/releasesを確認します。
1.正しいバージョンのPythonを選択します。ダウンロードが成功すると、インストールパッケージが表示されます。[インストール]をクリックして、レジストリに見つからなかった必要なPythonバージョン3.5を表示します。
2.解決策は、register.pyという名前の新しいPythonスクリプトを作成することです。内容は次のとおりです。
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.プリンターを接続します。1行を印刷する場合は、次のようにテキストをプリンターに直接送信できます。
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)
これを得ました
ほぼこのようなものです。個人的には、文字を直接渡す方が便利だと思います。その方法については後で学習します。