Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • frank/web2print
1 result
Show changes
Commits on Source (7)
__pycache__/
This diff is collapsed.
This diff is collapsed.
#dropzone {
border: 1px dotted #aaa;
margin: 3em 10em;
padding: 2em;
text-align: center;
font-style: italic;
color: #999;
}
#dropzone:hover {
border-color: #000;
}
#dropzone.drop-active {
background-color: #eee;
color: #000;
border-color: #000;
}
#dropzone.drop-uploading {
background-color: #efe;
}
This diff is collapsed.
$(function() {
$("#dropzone").on("dragenter", highlight);
$("#dropzone").on("dragover", highlight);
$("#dropzone").on("dragleave", unhighlight);
$("#dropzone").on("drop", handleDrop);
$("#dropzone input[type=file]").on("click", function(e) {
e.stopPropagation();
});
$("#dropzone input[type=file]").on("change", handleSelect);
$("#dropzone").on("click", function() {
$("#dropzone input[type=file]").trigger('click');
});
});
function highlight(e) {
e.preventDefault();
e.stopPropagation();
$("#dropzone").addClass("drop-active");
}
function unhighlight(e) {
e.preventDefault();
e.stopPropagation();
$("#dropzone").removeClass("drop-active");
}
function handleDrop(e) {
e.preventDefault();
e.stopPropagation();
([...e.originalEvent.dataTransfer.files]).forEach(uploadFile);
}
function handleSelect(e) {
$("#dropzone").addClass("drop-uploading");
([...e.currentTarget.files]).forEach(uploadFile);
}
function uploadFile(file) {
$("#dropzone").addClass("drop-uploading");
let formData = new FormData();
formData.append('document', file)
fetch("/", {
method: 'POST',
body: formData
})
.then(function() { info("File " + file.name + " sent to printer."); })
.catch(function() { error("An error occured while sending " + file.name + " to printer.") })
}
function info(text) {
$("#dropzone").removeClass("drop-uploading");
$("#dropzone").removeClass("drop-active");
$("#messages").append('<div class="alert alert-success">' + text + "</div>");
setTimeout(clear, 3000);
}
function error(text) {
$("#dropzone").removeClass("drop-uploading");
$("#dropzone").removeClass("drop-active");
$("#messages").append('<div class="alert alert-danger">' + text + "</div>");
setTimeout(clear, 3000);
}
function clear() {
$("#messages").empty();
}
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Frank Sauerburger">
<title>Web2Print</title>
<link rel="stylesheet" href="/assets/bootstrap.min.css" />
<link rel="stylesheet" href="/assets/custom.css" />
<script src="/assets/jquery-3.4.1.min.js"></script>
<script src="/assets/upload.js"></script>
</head>
<body>
<header class="navbar navbar-expand navbar-dark bg-dark">
<nav class="container">
<div class="navbar-brand">Web2Print</div>
</nav>
</header>
<main class="container pt-3">
{% if not printers %}
<div class="alert alert-danger">
Cannot find any printer!
</div>
{% else %}
<div id="messages"></div>
<div class="form-group row">
<label class="col-form-label col-md-2" htmlFor="printer">Printer</label>
<select id="printer" class="form-control col-md-10">
{% for printer in printers %}
<option value="{{ printer }}">{{ printer }}</option>
{% endfor %}
</select>
</div>
<div id="dropzone">
Drop PDF files here.
<input type="file" id="document" class="d-none" />
</div>
{% endif %}
</main>
</body>
</html>
import os
from time import time
import cups
from flask import Flask, render_template, request, send_from_directory
from werkzeug.utils import secure_filename
CUPS_SERVER = "10.1.9.104:631"
cups.setServer(CUPS_SERVER)
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = "/tmp/web2print"
os.makedirs("/tmp/web2print", exist_ok=True)
@app.route('/assets/<string:resource>')
def assets(resource):
return send_from_directory("assets", resource)
def get_printers():
conn = cups.Connection()
return list(conn.getPrinters())
@app.route('/', methods=["POST", "GET"])
def index():
if (request.method == "GET") or ("document" not in request.files) or \
(not request.files["document"].filename):
return render_template("index.html", printers=printers)
file = request.files['document']
filename = secure_filename(file.filename)
local_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(local_path)
conn = cups.Connection()
conn.printFile(printers[0], local_path, "web2print-%d" % time(),
{"fit-to-page": "True", "sides": "two-sided-long-edge"})
try:
os.remove(local_path)
except OSError:
pass
return "ok"
if __name__ == '__main__':
printers = get_printers()
app.run(host="0.0.0.0")