Teilen

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

You may also like