Paperless | PDF Dateien automatisch entsperren
Schwierigkeit: Einfach
Zeitaufwand: 10-15 Minuten
Wenn du passwortgeschützte PDF-Dateien importieren möchtest, deren Passwort immer gleich ist, kannst du ein kleines Skript verwenden. Dieses Skript wird während des Importvorgangs automatisch ausgeführt und entfernt das Passwort von den PDF-Dateien, sodass sie wie gewohnt weiterverarbeitet werden können.
Voraussetzungen:
– PaperlessNGX ist installiert
Wenn ihr PaperlessNGX mit der hier verfügbaren Anleitung installiert habt könnt ihr gleich zu Schritt 2 weiter gehen, wenn nicht solltest du folgendes tun:
1. Script Ordner erstellen und in Docker hinterlegen
Damit PaperlessNGX Zugriff auf das später folgende Skript hat muss ein neuer Ordner erstellt werden in dem wir die benötigten Datein hinterlegen. Erstelle hierzu einen Ordner und füge ihn dann als Volume (rot markiert) deiner docker-compose Datei hinzu und starte den Stack danach erneut:
version: "3.6"
services:
broker:
image: redis
container_name: Paperless-NGX-REDIS
restart: always
volumes:
- /srv/docker/paperlessngx/redis:/data
db:
image: postgres:15.5
container_name: Paperless-NGX-DB
restart: always
volumes:
- /srv/docker/paperlessngx/db:/var/lib/postgresql/data
environment:
POSTGRES_DB: paperless
POSTGRES_USER: paperless
POSTGRES_PASSWORD: paperless
webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
container_name: Paperless-NGX
restart: always
depends_on:
- db
- broker
ports:
- 8777:8000
volumes:
- /srv/docker/paperlessngx/data:/usr/src/paperless/data
- /srv/docker/paperlessngx/media:/usr/src/paperless/media
- /srv/docker/paperlessngx/export:/usr/src/paperless/export
- /srv/docker/paperlessngx/scripts:/usr/src/paperless/scripts
- /home/Jordy/Dokumente:/usr/src/paperless/consume
environment:
PAPERLESS_CONSUMER_POLLING: 60
PAPERLESS_REDIS: redis://broker:6379
PAPERLESS_DBHOST: db
PAPERLESS_TIME_ZONE: Europe/Bucharest
PAPERLESS_ADMIN_USER: Jordy
PAPERLESS_ADMIN_PASSWORD: PASSWORT
PAPERLESS_OCR_LANGUAGE: deu+eng
2. Script anpassen und in Docker hinterlegen
Erstelle nun eine passwords.txt Datei in deinem Script Ordner und füge ihr dein Passwort hinzu, falls du mehrere mögliche Passwörter hast, schreibe diese jeweils in eine neue Zeile:
Passwort1
Passwort2
Speichere nun diese Datei und erstelle eine neu Datei „removepassword.py“ und füge folgendes ein:
#!/usr/bin/env python3
import os
import pikepdf
def is_pdf(file_path: str) -> bool:
return os.path.splitext(file_path.lower())[1] == ".pdf"
def is_pdf_encrypted(file_path: str) -> bool:
try:
with pikepdf.open(file_path) as pdf:
return pdf.is_encrypted
except:
return True
def pdf_has_attachments(file_path: str) -> bool:
try:
with pikepdf.open(file_path) as pdf:
return len(pdf.attachments) > 0
except:
return False
def unlock_pdf(file_path: str):
password = None
print("reading passwords")
with open(pass_file_path, "r") as f:
passwords = f.readlines()
for p in passwords:
password = p.strip()
try:
with pikepdf.open(
file_path, password=password, allow_overwriting_input=True
) as pdf:
# print("password is working")
print("unlocked succesfully")
pdf.save(file_path)
break
except pikepdf.PasswordError:
print("password is not working")
continue
if password is None:
print("empty password file")
def extract_pdf_attachments(file_path: str):
with pikepdf.open(file_path) as pdf:
ats = pdf.attachments
for atm in ats:
trg_filename = ats.get(atm).filename
if is_pdf(trg_filename):
trg_file_path = os.path.join(consume_path, trg_filename)
try:
with open(trg_file_path, "wb") as wb:
wb.write(ats.get(atm).obj["/EF"]["/F"].read_bytes())
print("saved: ", trg_file_path)
except:
print("error ", trg_file_path)
continue
else:
print("skipped: ", trg_filename)
src_file_path = os.environ.get('DOCUMENT_WORKING_PATH')
pass_file_path = "/usr/src/paperless/scripts/passwords.txt"
consume_path = "/usr/src/paperless/consume/"
if src_file_path is None:
print("no file path")
exit(0)
if not is_pdf(src_file_path):
print("not pdf")
exit(0)
if is_pdf_encrypted(src_file_path):
print("decrypting pdf")
unlock_pdf(src_file_path)
else:
print("not encrypted")
if pdf_has_attachments(src_file_path):
print("getting attachments")
extract_pdf_attachments(src_file_path)
else:
print("no attachments")
Dieses Skript prüft jede Datei in in Paperless eingeht ob sie ein Passwort benötigt, falls das so ist werden die Passwörter aus der password.txt angewandt und der Schutz wird entfernt.
Das Skript stammt ursprünglich von piep.tech hat aber einige Änderungen da das Skript für micht nicht funktioniert hat
3. Skript in der docker-compose Datei angeben
Füge folgendes am Ende deiner Datei hinzu und starte den Stack danach erneut:
PAPERLESS_PRE_CONSUME_SCRIPT: /usr/src/paperless/scripts/removepassword.py
Das wars bereits, das Skript ist nun konfiguriert und entfernt die Passwörter deiner PDF Dateien