浏览代码

first working version

Markus Spring 1 年之前
父节点
当前提交
73e9532e06
共有 12 个文件被更改,包括 345 次插入1 次删除
  1. 2 0
      .gitignore
  2. 3 0
      .gitmodules
  3. 35 0
      Dockerfile
  4. 1 1
      README.md
  5. 58 0
      app/server.py
  6. 65 0
      app/start.sh
  7. 29 0
      app/templates/upload.html
  8. 0 0
      app/uploads/.gitkeep
  9. 3 0
      cups-files.conf
  10. 116 0
      cupsd.conf
  11. 32 0
      docker-compose.yml
  12. 1 0
      rastertokpsl-re

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+.env
+*~

+ 3 - 0
.gitmodules

@@ -0,0 +1,3 @@
+[submodule "rastertokpsl-re"]
+	path = rastertokpsl-re
+	url = https://github.com/Fe-Ti/rastertokpsl-re/

+ 35 - 0
Dockerfile

@@ -0,0 +1,35 @@
+ARG network=host
+
+FROM bitnami/minideb:bookworm
+
+RUN install_packages \
+    libcupsimage2 \
+    cups-daemon \
+    cups-client \
+    cups \
+    less \
+    vim \
+    sudo \
+    cups-pdf \
+    python3 \
+    python3-flask \
+    python3-pypdf2
+    
+    # netcat-traditional \
+    # pip
+
+
+COPY ./rastertokpsl-re /rastertokpsl-re
+RUN   cd /rastertokpsl-re && ./install.sh
+
+COPY cupsd.conf cups-files.conf /etc/cups/
+
+RUN cupsd -f & pid=$! && \
+    while test ! -S /run/cups/cups.sock; do sleep 1; done && \
+    lpadmin -p Kyocera_Laser -v socket://192.168.2.3:9100 -P /usr/share/cups/model/Kyocera/Kyocera_FS-1060DNGDI.ppd -E && \
+    while kill "$pid" 2>/dev/null; do sleep 1; done
+
+#ADD . /app
+ADD app /app
+ENTRYPOINT ["/app/start.sh"]
+

+ 1 - 1
README.md

@@ -1,3 +1,3 @@
 # pdf2kyocera
 
-A docker service to upload and print pdf documents on a kyocera printer in the home network
+A docker service to upload and print pdf documents on a kyocera printer in the home network

+ 58 - 0
app/server.py

@@ -0,0 +1,58 @@
+from flask import Flask, escape, render_template, request, redirect
+from werkzeug.utils import secure_filename
+import PyPDF2
+import subprocess
+import sys
+
+app = Flask(__name__)
+
+def pdf_check(file):
+    try:
+        pdf = PyPDF2.PdfFileReader(open(file, "rb"))
+    except:
+        return False
+    else:
+        return True
+
+def size_check(file):
+    pdf = PyPDF2.PdfReader(open(file, "rb"))
+    print(pdf.getDocumentInfo())
+    ptSqr = pdf.getPage(0).mediaBox[2] * pdf.getPage(0).mediaBox[3]
+    if ptSqr > 400000:
+        print("A4  " + str(ptSqr))
+        return "A4"
+    elif ptSqr < 150000:
+        print("Label  " + str(ptSqr))
+        return "label"
+    else:
+        print("Unknown paper size")
+        return "unknown"
+
+def label_print(file):
+    print("calling lpr command")
+    print(" ".join(["lp", "-d", "Kyocera_Laser", "-o" "fit-to-page", file]), file=sys.stderr)
+    subprocess.call(["lp", "-d", "Kyocera_Laser", "-o" "fit-to-page", file])
+
+@app.route('/')
+def root():
+    return redirect("/upload", code=302)
+
+@app.route('/upload')
+def upload_page():
+   return render_template('upload.html')
+        
+@app.route('/uploader', methods = ['GET', 'POST'])
+def upload_file():
+    if request.method == 'POST':
+        f = request.files['file']
+        file = "uploads/" + secure_filename(f.filename)
+        f.save(file)
+        if pdf_check(file):
+            if size_check(file) == "A4":
+                label_print(file)
+                return redirect("/upload", code=302)
+            return "great pdf but size is not A4"
+        else:
+            return "file is not a usable pdf"
+    else:
+        return redirect("/upload", code=302)

+ 65 - 0
app/start.sh

@@ -0,0 +1,65 @@
+#!/bin/bash
+
+# base dir
+cd /app
+
+# # start the cups daemon
+# source /app/start_cups.sh
+# exec /usr/sbin/cupsd -f&
+
+# echo "waiting for cups to start"
+# while [ "$(nc -z 127.0.0.1 631; echo $?)" -gt 0 ] ; do
+# 	echo "."
+# 	sleep 0.01
+# done
+
+# ## connect the printers
+# echo "Deleting all printers"
+# for printer in `lpstat -p | awk '{print $2}'`
+# do
+#     echo "   Deleting $printer"
+#     lpadmin -x $printer
+# done
+# connection_name="ipp"
+# #lpadmin -p ipp -E -v ipp://${IPP_IP}/ipp/print -m everywhere
+# # lpadmin -p $connection_name -E -v bjnp://canon-mg5350.fritz.box:8611 
+# #lpadmin -p $connection_name -P /app/canon-mg5300.ppd 
+# #        -m "gutenprint.5.3://bjc-PIXUS-MG5330/expert Canon PIXUS MG5330 - CUPS+Gutenprint v5.3.3" \
+# # ppd erzeugt mit "cups-genppdupdate -v "
+# lpadmin -p $connection_name -E -v bjnp://canon-mg5350.fritz.box:8611  \
+#         -P /app/ipp.ppd 
+# lpadmin -p $connection_name \
+#         -o copies=1 \
+#         -o finishings=3 \
+#         -o job-cancel-after=10800 \
+#         -o job-hold-until=no-hold \
+#         -o job-priority=50 \
+#         -o job-sheets=none,none \
+#         -o marker-change-time=0 \
+#         -o number-up=1 \
+#         -o print-color-mode=color \
+#         -o printer-commands=none \
+#         -o printer-info=ipp \
+#         -o printer-is-accepting-jobs=true \
+#         -o printer-is-shared=true \
+#         -o printer-is-temporary=false \
+#         -o printer-location \
+#         -o printer-make-and-model='Canon MG5300 series - CUPS+Gutenprint v5.3.3' \
+#         -o printer-state=3 \
+#         -o printer-state-change-time=1678815320 \
+#         -o printer-state-reasons=none \
+#         -o printer-type=36892 \
+#         -o printer-uri-supported=ipp://localhost/printers/ipp
+
+# cupsenable $connection_name
+# cupsaccept $connection_name
+# lpoptions -d $connection_name
+
+
+# lpstat -p -d
+
+#exec
+cupsd -f "$@" &
+
+env FLASK_APP=server.py flask run --host=0.0.0.0 --port 5000
+

+ 29 - 0
app/templates/upload.html

@@ -0,0 +1,29 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+   <!-- Required meta tags -->
+   <meta charset="utf-8">
+   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+
+   <!-- Bootstrap CSS -->
+   <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"
+      integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
+
+   <title>network pdf printer</title>
+</head>
+
+<body>
+   <main role="main" class="container">
+      <div class="jumbotron">
+         <h1>network pdf printer</h1>
+         <p class="lead">On this page you can upload pdf files to be printed on the network printer.</p>
+         <form action="/uploader" method="POST" enctype="multipart/form-data">
+            <input type="file" name="file" />
+            <input type="submit" class="btn btn-primary mb-2" value="Upload">
+         </form>
+      </div>
+   </main>
+</body>
+
+</html>

+ 0 - 0
app/uploads/.gitkeep


+ 3 - 0
cups-files.conf

@@ -0,0 +1,3 @@
+SystemGroup lpadmin root
+ErrorLog stderr
+PageLog stderr

+ 116 - 0
cupsd.conf

@@ -0,0 +1,116 @@
+LogLevel warn
+PageLogFormat "%p %u %j %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}"
+MaxLogSize 0
+Listen 6310
+Listen /run/cups/cups.sock
+Browsing Off
+DefaultAuthType Basic
+WebInterface Yes
+ServerAlias *
+<Location />
+  Order allow,deny
+  Allow all
+</Location>
+<Location /admin>
+  Satisfy all
+  AuthType Default
+  Require user @SYSTEM
+  Order allow,deny
+  Allow all
+</Location>
+<Policy default>
+  JobPrivateAccess default
+  JobPrivateValues default
+  SubscriptionPrivateAccess default
+  SubscriptionPrivateValues default
+  <Limit Create-Job Print-Job Print-URI Validate-Job>
+    Order deny,allow
+  </Limit>
+  <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job Cancel-My-Jobs Close-Job CUPS-Move-Job CUPS-Get-Document>
+    Require user @OWNER @SYSTEM
+    Order deny,allow
+  </Limit>
+  <Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default CUPS-Get-Devices>
+    AuthType Default
+    Require user @SYSTEM
+    Order deny,allow
+  </Limit>
+  <Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After Cancel-Jobs CUPS-Accept-Jobs CUPS-Reject-Jobs>
+    AuthType Default
+    Require user @SYSTEM
+    Order deny,allow
+  </Limit>
+  <Limit Cancel-Job CUPS-Authenticate-Job>
+    Require user @OWNER @SYSTEM
+    Order deny,allow
+  </Limit>
+  <Limit All>
+    Order deny,allow
+  </Limit>
+</Policy>
+<Policy authenticated>
+  JobPrivateAccess default
+  JobPrivateValues default
+  SubscriptionPrivateAccess default
+  SubscriptionPrivateValues default
+  <Limit Create-Job Print-Job Print-URI Validate-Job>
+    AuthType Default
+    Order deny,allow
+  </Limit>
+  <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job Cancel-My-Jobs Close-Job CUPS-Move-Job CUPS-Get-Document>
+    AuthType Default
+    Require user @OWNER @SYSTEM
+    Order deny,allow
+  </Limit>
+  <Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default>
+    AuthType Default
+    Require user @SYSTEM
+    Order deny,allow
+  </Limit>
+  <Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After Cancel-Jobs CUPS-Accept-Jobs CUPS-Reject-Jobs>
+    AuthType Default
+    Require user @SYSTEM
+    Order deny,allow
+  </Limit>
+  <Limit Cancel-Job CUPS-Authenticate-Job>
+    AuthType Default
+    Require user @OWNER @SYSTEM
+    Order deny,allow
+  </Limit>
+  <Limit All>
+    Order deny,allow
+  </Limit>
+</Policy>
+<Policy kerberos>
+  JobPrivateAccess default
+  JobPrivateValues default
+  SubscriptionPrivateAccess default
+  SubscriptionPrivateValues default
+  <Limit Create-Job Print-Job Print-URI Validate-Job>
+    AuthType Negotiate
+    Order deny,allow
+  </Limit>
+  <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job Cancel-My-Jobs Close-Job CUPS-Move-Job CUPS-Get-Document>
+    AuthType Negotiate
+    Require user @OWNER @SYSTEM
+    Order deny,allow
+  </Limit>
+  <Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default>
+    AuthType Default
+    Require user @SYSTEM
+    Order deny,allow
+  </Limit>
+  <Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After Cancel-Jobs CUPS-Accept-Jobs CUPS-Reject-Jobs>
+    AuthType Default
+    Require user @SYSTEM
+    Order deny,allow
+  </Limit>
+  <Limit Cancel-Job CUPS-Authenticate-Job>
+    AuthType Negotiate
+    Require user @OWNER @SYSTEM
+    Order deny,allow
+  </Limit>
+  <Limit All>
+    Order deny,allow
+  </Limit>
+</Policy>

+ 32 - 0
docker-compose.yml

@@ -0,0 +1,32 @@
+version: "3.4"
+
+services:
+  kyo-cups-server:
+    image: mws/pdf2kyocera
+    build:
+      context: .
+      network: host
+#    container_name: kyo-cups-server
+    container_name: pdf2kyocera
+    ports:
+      - 5000:5000
+      - 631:6310
+    environment:
+     - UID=1000
+     - GID=1000
+    restart: unless-stopped
+    labels:
+      - "traefik.enable=true"
+      - "traefik.http.routers.kyo-cups-server.rule=Host(`{$HOSTNAME}`)" 
+      - "traefik.http.middlewares.auth.basicauth.users={$BASICAUTHUSER}:{$BASICAUTHPASS}"  # biofire
+      - "traefik.http.routers.kyo-cups-server.middlewares=traefikAuth@file,default@file"
+      - "traefik.http.routers.kyo-cups-server.entrypoints=websecure"
+      - "traefik.http.routers.kyo-cups-server.tls=true"
+      - "traefik.http.routers.kyo-cups-server.tls.certresolver={$CERTRESOLVER}"
+      - "traefik.http.services.kyo-cups-server.loadBalancer.server.port=5000"
+    networks:
+      - proxy
+
+networks:
+  proxy:
+    external: true

+ 1 - 0
rastertokpsl-re

@@ -0,0 +1 @@
+Subproject commit 84dcb2bc0d9a6797eedcd56f2e603dde2fbbf290