python 全自动打印网站

项目介绍

  • 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()

花生壳内网穿透

花生壳
配置详情
成功配置内网穿透

创建一个保存打印文件的目录

存放文件

运行项目

run
success
网站映射成功,通过外网网址进入网站可以看见网站内容

说明

打印机高级选项设置

	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
Duplex1单面 2长边装订双面 3短边装订双面
Orientation未知,我怎么设置都只能纵向打印
Color0彩色 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

### Python终端输出显示不完整的原因分析 当Python程序在终端执行时,可能会遇到输出被截断或未完全展示的情况。这通常由几个因素引起: - **缓冲区设置不当**:默认情况下,某些操作系统上的标准输出流可能是行缓冲甚至全缓冲模式,在这种状态下,除非刷新缓存或者达到一定量的数据才会真正发送到屏幕。 - **IDE配置问题**:像VS Code这样的集成开发环境中可能存在特定于该平台的配置影响了正常的输出行为。 为了确保完整的输出能够正确呈现给用户,以下是具体的解决方案[^2]。 ### 解决方案一:修改缓冲机制 对于脚本本身来说,可以通过改变`sys.stdout`的标准输出对象来控制其是否立即刷新。通过导入`sys`模块并调用`flush()`函数强制即时刷新输出缓冲区,从而避免内容丢失。 ```python import sys print("部分信息", flush=True) ``` 这种方式适用于希望每次调用`print()`之后都立刻看到结果的情形。 ### 解决方案二:调整IDE/编辑器设置 针对使用Visual Studio Code作为主要开发工具的朋友,如果遇到了类似“终端无任何输出”的情况,则可能是因为安装了最新的Python扩展而导致的问题。尝试回滚至更稳定的旧版本(如文中提到的降级到2021年发布的版本),往往能有效解决问题[^4]。 另外,也可以考虑更改输出目标为内部控制台而非外部终端,这样可以获得更加稳定的表现形式: 打开项目的launch.json文件,并做如下改动: ```json { "version": "0.2.0", "configurations": [ { ... "console": "internalConsole" } ] } ``` 这样做可以让调试过程中的所有日志都被重定向到VS Code自带的Debug Console窗口内,而不是依赖系统自带或其他第三方提供的shell环境。 ### 解决方案三:增加最大行数限制 有时即使解决了上述两个方面的问题,仍然会面临因终端本身的特性所造成的输出不全现象——即超过了一定数量后自动滚动删除早期记录。此时可以在启动命令前加上相应参数以扩大历史记录容量;例如Linux下可通过`.bashrc`文件永久生效此设定: ```bash export HISTSIZE=10000 shopt -s histappend PROMPT_COMMAND='history -a' ``` 而在Windows PowerShell里则需修改注册表项`HKCU:\Software\Microsoft\Command Processor\AutoRun` 或者直接利用PowerShell自身的属性进行临时性的增大: ```powershell $host.UI.RawUI.BufferSize = New-Object Management.Automation.Host.Size(120, 3000) ``` 以上措施有助于提高用户体验,使得更多有用的信息得以保留下来供后续查看和分析。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值