项目介绍
- win32print可以打开打印机,进行打印操作,以及一些高级打印机设置。
- flask作为一个轻量级的web框架,很适合做一个无人打印自助的前端技术。
- 使用花生壳进行内网穿透
- 界面使用bootstrap稍加美化
- 可以实现远程提交docx文件到本地电脑,调动打印机打印文件
后端截图
前端截图
开始部署项目
导入pywin32,os,flask库
源代码
#!/user/bin/python
# _*_ coding:utf-8 _*_
#开发人员:eu_zero
#开发时间2021/10/19 16:57
#文件名称: test.py
#开发工具: pycharm
#项目名称 test
from flask import Flask
from flask import request
import os
import win32print
import win32api
def printer_loading(filename,chooseDuplex,chooseColor,chooseCopies):
# name = win32print.GetDefaultPrinter()
name = "EPSON L3150 Series"
# printdefaults = {"DesiredAccess": win32print.PRINTER_ACCESS_ADMINISTER}
printdefaults = {"DesiredAccess": win32print.PRINTER_ACCESS_USE}
handle = win32print.OpenPrinter(name, printdefaults)
level = 2
attributes = win32print.GetPrinter(handle, level)
print("old Duplex = %d" % attributes['pDevMode'].Duplex)
print("old Orientation = %d" % attributes['pDevMode'].Orientation)
print("old color = %d" % attributes['pDevMode'].Color)
print("old copies = %d" % attributes['pDevMode'].Copies)
attributes['pDevMode'].Duplex = int(chooseDuplex) # 1单面 2长边装订双面 3短边装订双面
attributes['pDevMode'].Orientation = 2 #纵向打印(暂时无法横向打印)
attributes['pDevMode'].Color = int(chooseColor) # 0彩色 1黑白
attributes['pDevMode'].Copies = int(chooseCopies) #份数
try:
win32print.SetPrinter(handle, level, attributes, 0)
except:
print("new Duplex = %d" % attributes['pDevMode'].Duplex)
print("new Orientation = %d" % attributes['pDevMode'].Orientation)
print("new color = %d" % attributes['pDevMode'].Color)
print("new copies = %d" % attributes['pDevMode'].Copies)
res = win32api.ShellExecute(0, 'print', filename, None, '.', 0)
win32print.ClosePrinter(handle)
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def home():
return '''
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<title>奔腾自助打印网站</title>
</head>
<body>
<p align="center">
<form class="mb-3" action="/printExcute" method="post" enctype="multipart/form-data">
<div>
<br/>
<input class="form-control form-control-lg" id="formFileLg" type="file" name="printfile">
<br/>
<select class="form-select" aria-label="Default select example" name="chooseDuplex">
<option selected>请选择单双面类型</option>
<option value='1'>单面打印</option>
<option value='2'>双面打印(长边装订)</option>
<option value='3'>双面打印(短边装订)</option>
</select>
<br/>
<select class="form-select" aria-label="Default select example" name="chooseColor">
<option selected>请选择是否为黑白或彩色打印</option>
<option value='0'>彩色</option>
<option value='1'>黑白</option>
</select>
<br/>
<select class="form-select" aria-label="Default select example" name="chooseCopies">
<option selected>请选择打印份数</option>
<option value='1'>1</option>
<option value='2'>2</option>
<option value='3'>3</option>
<option value='4'>4</option>
<option value='5'>5</option>
<option value='6'>6</option>
<option value='7'>7</option>
<option value='8'>8</option>
<option value='9'>9</option>
<option value='10'>10</option>
</select>
<br/>
<input class="btn btn-primary mb-3" type="submit" name="mufile" value="提交打印文件">
</div>
</form>
</p>
</body>
</html>
'''
@app.route('/printExcute', methods=['POST'])
def printExcute():
#接收文件,准备保存打印
f = request.files.get('printfile')
print(f.filename)
path = r'C:\Users\29678\PycharmProjects\test\项目\打印网站\网站传输打印目录'
file_path = os.path.join(path, f.filename)
f.save(file_path) # 保存到指定目录
print("成功保存")
if file_path.endswith("docx") or file_path.endswith("pdf"):
printer_loading(file_path,request.form['chooseDuplex'],request.form['chooseColor'],request.form['chooseCopies'])
print('打印机启动完毕')
return '<p>打印提交成功</p>'
if __name__ == '__main__':
app.run()
花生壳内网穿透
成功配置内网穿透
创建一个保存打印文件的目录
运行项目
网站映射成功,通过外网网址进入网站可以看见网站内容
说明
打印机高级选项设置
attributes['pDevMode'].Duplex = int(chooseDuplex) # 1单面 2长边装订双面 3短边装订双面
attributes['pDevMode'].Orientation = 2 #纵向打印(暂时无法横向打印)
attributes['pDevMode'].Color = int(chooseColor) # 0彩色 1黑白
attributes['pDevMode'].Copies = int(chooseCopies) #份数
一个简单的表格是这么创建的:
类变量 | Value |
---|---|
Duplex | 1单面 2长边装订双面 3短边装订双面 |
Orientation | 未知,我怎么设置都只能纵向打印 |
Color | 0彩色 1黑白 |
Copies | 份数 |
[1]: flask用户指南 https://dormousehole.readthedocs.io/en/latest/
[2]: 高级打印设置 https://blog.csdn.net/u011356154/article/details/115719225?ops_request_misc=&request_id=&biz_id=102&utm_term=win32print%20%E6%A8%A1%E5%9D%97&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-2-115719225.pc_search_result_hbase_insert&spm=1018.2226.3001.4187