Login
下载
Home
/
CloudPrinter
/
printer.py
printer.py
download
import os import win32print import subprocess from flask import Flask, request, redirect, url_for, render_template_string import pythoncom from win32com import client import win32api import ctypes app = Flask(__name__) UPLOAD_FOLDER = 'D:\\uploads\\' ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'doc', 'docx'} if not os.path.exists(UPLOAD_FOLDER): os.makedirs(UPLOAD_FOLDER) def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS def set_default_printer(printer_name): try: win32print.SetDefaultPrinter(printer_name) return True except Exception as e: print(f"设置默认打印机失败: {str(e)}") return False def print_file(filepath, printer_name): try: print(f"正在打印的打印机: {printer_name}") # 设置默认打印机 if not set_default_printer(printer_name): raise ValueError("指定的打印机未找到或无法设置为默认打印机。") # 打印文件 file_extension = filepath.rsplit('.', 1)[1].lower() if file_extension in {'txt', 'pdf', 'doc', 'docx'}: # 使用 win32api 打印文件 win32api.ShellExecute(0, "print", filepath, None, ".", 0) elif file_extension in {'png', 'jpg', 'jpeg', 'gif'}: # 使用 Windows 照片查看器打印图像文件 subprocess.run(['rundll32', 'C:\\WINDOWS\\System32\\shimgvw.dll,ImageView_PrintTo', filepath, printer_name], check=True) else: raise ValueError("不支持的文件类型。") print("文件打印成功") return "文件打印成功" except Exception as e: print(f"发生错误: {str(e)}") return f"打印文件失败: {str(e)}" @app.route('/', methods=['GET', 'POST']) def upload_file(): html = """ <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>国投公司云打印服务</title> <style> body { font-family: Arial, sans-serif; background-color: #f8f9fa; margin: 0; padding: 0; } .container { max-width: 600px; margin: 50px auto; padding: 20px; background-color: #fff; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); border-radius: 5px; text-align: center; } h2 { margin-bottom: 20px; } label { display: block; margin-bottom: 10px; } input[type="file"] { width: 100%; padding: 10px; margin-bottom: 20px; } button { padding: 10px 20px; background-color: #007bff; color: #fff; border: none; border-radius: 3px; cursor: pointer; width: 100%; } button:hover { background-color: #0056b3; } button:disabled { background-color: #6c757d; cursor: not-allowed; } .message { margin-top: 20px; padding: 10px; border-radius: 5px; } .success { background-color: #d4edda; color: #155724; } .error { background-color: #f8d7da; color: #721c24; } </style> <script> function toggleButton() { var checkbox = document.getElementById('confirm'); var printer = document.getElementById('printer'); var button = document.getElementById('submitButton'); button.disabled = !checkbox.checked || printer.value === ""; } function validatePrinterSelection() { var printer = document.getElementById('printer'); var button = document.getElementById('submitButton'); var checkbox = document.getElementById('confirm'); button.disabled = printer.value === "" || !checkbox.checked; } </script> </head> <body> <div class="container"> <img src="{{ url_for('static', filename='mtnlogo.jpg') }}" alt="MTN Logo"> <h2>国投公司云打印服务</h2> {% if message %} <div class="message {{ message_class }}">{{ message }}</div> {% endif %} <form method="POST" enctype="multipart/form-data"> <label for="file">选择文件:</label> <input type="file" id="file" name="file"><br><br> <label for="printer">选择云打印机:</label> <select id="printer" name="printer" onchange="validatePrinterSelection()"> <option value="">请选择打印机</option> {% for printer in printers %} <option value="{{ printer }}">{{ printer }}</option> {% endfor %} </select><br><br> <label for="confirm"> <input type="checkbox" id="confirm" onclick="toggleButton()"> 我已确认“云打印机”并同意《注意事项》 </label> <button type="submit" id="submitButton" disabled>使用所选云打印机直接打印</button> </form><br> <div style="text-align: left;"> <a>注意事项:</a><br> <a>1、无需安装任何驱动上传文件,选择所选的云打印机直接打印。</a><br> <a>2、仅限连接于宁兴集团内网的设备使用,包含手机以及其他移动终端设备。</a><br> <a>3、打印的文档类型仅限jpg,jpeg,png,gif,doc,docx,pdf等常规格式。</a><br> <a>4、默认所选的文件整个文档黑白双面打印,个性化设置请使用PC端本地打印。</a><br> <a>5、打印过的文件在公司的云打印服务器会有留痕,但无意侵犯您的隐私,涉及隐私和涉密内容请勿使用云打印。</a><br> </div> </div> </body> </html> """ message = None message_class = None if request.method == 'POST': if 'file' not in request.files: message = '没有文件部分' message_class = 'error' else: file = request.files['file'] if file.filename == '': message = '未选择文件' message_class = 'error' elif file and allowed_file(file.filename): filename = file.filename filepath = os.path.join(UPLOAD_FOLDER, filename) file.save(filepath) printer_name = request.form.get('printer') try: message = print_file(filepath, printer_name) message_class = 'success' if '成功' in message else 'error' except Exception as e: message = f'打印文件失败: {str(e)}' message_class = 'error' return render_template_string(html, message=message, message_class=message_class, printers=get_printers()) return render_template_string(html, printers=get_printers()) def get_printers(): return [printer[2] for printer in win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL | win32print.PRINTER_ENUM_CONNECTIONS)] if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=80)
Close
2025-07-13 05:39:17 Sunday 18.97.14.85 Runningtime:2.381s Mem:419.24 KB