Paperless: Bockige OCR PDF/A Dateien brauchen extra Behandlung bevor Paperless sie importiert (Ghostscript error)

Moin

  • Mein Paperless Setup: Synology Container Manager
  • Ich scanne noch nicht ein aber verschiebe bereits auf Rechner gespeicherte PDF Dokumente nach Paperless CONSUME
  • Problem: Einige frühere PDF Versionen werden von Paperless nicht importiert und enden mit Fehlermeldun und Exceptions im Log
paperless import aus CONSUME Ordner kommt es zu Fehlern
File "/usr/local/lib/python3.12/site-packages/ocrmypdf/builtin_plugins/ghostscript.py", line 131, in generate_pdfa
    ghostscript.generate_pdfa(
File "/usr/local/lib/python3.12/site-packages/ocrmypdf/_exec/ghostscript.py", line 312, in generate_pdfa
    raise SubprocessOutputError('Ghostscript PDF/A rendering failed') from e
ocrmypdf.exceptions.SubprocessOutputError: Ghostscript PDF/A rendering failed
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/asgiref/sync.py", line 327, in main_wrap
    raise exc_info[1]
  File "/usr/src/paperless/src/documents/consumer.py", line 493, in run
    document_parser.parse(self.working_copy, mime_type, self.filename)
  File "/usr/src/paperless/src/paperless_tesseract/parsers.py", line 406, in parse
    raise ParseError(
documents.parsers.ParseError: SubprocessOutputError: Ghostscript PDF/A rendering failed. See logs for more information.
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
  File "/usr/src/paperless/src/documents/tasks.py", line 179, in consume_file
    msg = plugin.run()
  File "/usr/src/paperless/src/documents/consumer.py", line 525, in run
    self._fail(
  File "/usr/src/paperless/src/documents/consumer.py", line 152, in _fail
    raise ConsumerError(f"{self.filename}: {log_message or message}") from exception
documents.consumer.ConsumerError: Jahreskontoauszug_2023_21367323.pdf: Error occurred while consuming document Jahreskontoauszug_2023_21367323.pdf: SubprocessOutputError: Ghostscript PDF/A rendering failed. See logs for more information.

  • Abhilfe schafft ein NEU Konvertieren zu einer PDF/A Norm
  • ich habs mit Tools probiert aber ich will doch nicht jede Datei einzeln behandeln

BASH Script

  • abgelegt im paperless-office faule_pdfs_konvertieren.sh und ausführbar gemacht mit
chmod +x faule_pdfs_konvertieren.sh
  • Die bockigen PDF Dateien habe ich im Ordner pdf-block abgelegt.
    Probiert es erstmal mit nur einem PDF. Ich habe 10 auf einmal durchprobiert und es ging.

paperless-office
  |-- consume
       |-- pdf-block

Ok, das Script tut folgendes

  • Nimmt sich jedes PDF Datei im Ordner PDF-Block
  • Konvertiert es zu einem PDF/A Format was auch Paperless versteht (nutzt dabei das Tool ocrmypdf im laufenden Paperless Webserver Container)
  • Kopiert die neue Version mit gleichem Dateinamen in das Consume Verzeichnis und Paperless startet den automatischen Import
  • Löscht alte Datei und temporär angelegtes Verzeichnis
# Bacardi, Version 1.0 April 2025

# Problem: Einige PDF Dateien (z.B. bei Bank Kontoauszügen) können von Paperless nicht richtig PDF/A konvertiert werden

# Was das Script macht:
# - Nimmt die PDF Dateien aus dem Verzeichnis CONSUME/PDF-BLOCK
# - Nutzt das Tool ocrmypdf im laufenden Paperless Webserver Container und
# - konvertiert diese mit dem Tool ocrmypdf und legt die konvertierte Version mit gleichen Namen in das CONSUME Verzeichnis wo Paperless automatisch seine Arbeit aufnimmt
# - löscht die Datei im PDF-BLOCK Verzeichnis und auch das temporär angelegte Tmp Verzeichnis

# - Voraussetung: Script funktioniert nur wenn Paperless Container laufen!
#!/bin/bash

# === Konfiguration ===
WATCH_DIR="/volume1/docker/paperless-office/consume/pdf-block/"   # Reales Verzeichnis auf der NAS
CONTAINER_NAME="paperless-office-webserver"                       # Name Eures Paperless Webserver Containers
CONTAINER_CONSUME_DIR="/usr/src/paperless/consume"                # Name des Consume Ordners im Container

# === Prüfung, ob das Quellverzeichnis existiert ===
if [ ! -d "$WATCH_DIR" ]; then
    echo "[FEHLER] Quellordner existiert nicht: $WATCH_DIR"
    exit 1
fi

echo "[OK] Starte Verarbeitung der PDF-Dateien im Verzeichnis: $WATCH_DIR"

# === Initialisierung der Zähler ===
SUCCESS=0
FAILED=0

# === Verarbeitung jeder PDF-Datei ===
for FILE in "$WATCH_DIR"*.pdf; do
    [ -e "$FILE" ] || continue

    FILENAME=$(basename "$FILE")

    # Temporäres Verzeichnisanlegen unter consume/pdf-block
    TEMP_DIR=$(mktemp -d -p "$WATCH_DIR" tmp.XXXXXXXXXX)
    # Bei Script Abbrucgh oder am Ende wird das Temp Verzeichnis gelöscht
    trap 'rm -rf "$TEMP_DIR"' EXIT

    cp "$FILE" "$TEMP_DIR/$FILENAME"

    # Temporäres Verzeichnis in den Container kopieren
    docker cp "$TEMP_DIR" "$CONTAINER_NAME:/tmp/ocr_temp"

    # OCR-Verarbeitung im Container durchführen
    docker exec "$CONTAINER_NAME" ocrmypdf --force-ocr --output-type pdfa "/tmp/ocr_temp/$FILENAME" "/tmp/ocr_temp/ocr_$FILENAME"

    if [ $? -eq 0 ]; then
        # Konvertierte Datei aus dem Container zurückkopieren
        docker cp "$CONTAINER_NAME:/tmp/ocr_temp/ocr_$FILENAME" "$WATCH_DIR$FILENAME"

        # Datei in das consume-Verzeichnis verschieben
        docker cp "$WATCH_DIR$FILENAME" "$CONTAINER_NAME:$CONTAINER_CONSUME_DIR/$FILENAME"

        # Temporäres Verzeichnis im Container entfernen
        docker exec "$CONTAINER_NAME" rm -rf "/tmp/ocr_temp"

        # Tmp Verzeichnis und alte PDF löschen
        rm -rf "$TEMP_DIR"
        rm "$FILE"

        echo "[OK] Erfolgreich verarbeitet: $FILENAME"
        ((SUCCESS++))
    else
        echo "[FEHLER] Fehler bei der Verarbeitung von: $FILENAME"
        ((FAILED++))
    fi
done

# === Finale Message ===
echo
if [ "$FAILED" -eq 0 ]; then
    echo "[FERTIG] Alle $SUCCESS PDF-Dateien wurden erfolgreich verarbeitet."
else
    echo "[WARNUNG] $SUCCESS PDF-Dateien erfolgreich verarbeitet, $FAILED mit Fehlern. Details siehe oben."
fi

  • Ich habe es nur auf der Synology NAS ausprobiert aber eigentlich müßte es überall gehen wo sich Bash Scripte ausführen lassen. Müßt Ihr probieren.

Wie immer: Anregungen jeder Art sind willkommen.
Vielleicht geht es auch ganz anders? Ihr müßt doch auch schon einmal auf diese Art von PDF Problemen gestoßen sein oder scannt Ihr wirklich nur ein?

Gutes Gelingen!

EDIT:
Was zum Gucken - ich jage gerade 10 weitere faule PDF’s durch die Neukonvertierung. NAS CPU am Anschlag :slight_smile:

Hab ähnliche Erfahrungen gemacht mit PDF-Rechnung vom meinem Mobilfunkvertrag, die liessen sich in PaperlessNGX nicht importieren.

Abhilfe schaffte nur einen “Drucken” in PDF

Aber coole Idee mit dem Script - Danke dafür, auch wenn ich mich von PaperlessNGX verabschiedet habe.

Ohnee, ich bin auf der Zielgeraden und will Ostern mit Scannen anfangen. Bitte nenne keine ernsten Wechselgründe :slight_smile:

Ich kann dir meine Gründe nennen - entscheiden muss du selber:
Ich mache seit rund 14 Jahren Papierloses Dokumentenverwaltung zuhause, also ist da einiges zusammen gekommen.
Ich hab alleine 2 Abende intensiv dran gesessen, nur meine Gehaltsabrechnung in PaperlessNGX zu importieren und richtig zu taggen, der hat z.b. das Datum immer falsch gesetzt - da hab ich dann aufgehört, weil ich längst nicht alle hatte. Einige hat der garnicht erst importiert.

Der Aufwand der Nachbearbeitet rechtfertig keinen Mehrwert der Software für mich.
Ich bennene alle Dokumente eindeutig, die Ordnerstruktur, wo die abgelegt sind, ich ähnlich wie bei Aktenordner im Regal.
Die finde ich bei Bedarf in kurzer Zeit manuell jedes Dokument und wenn ich z.b. die Rechnung vom Handy brauche, findet der MacOS-Finder die in 1 Sekunde, so schnell hab ich PaperlessNGX nicht mal geöffnet.

Und der wichtigste Punkt ist, was ist, wenn jemand auf meine Unterlagen zugreifen muss, falls mir was zustösst. Der braucht keine Extra-Software, der hängt die Backup-Festplatte an seinen Rechner, egal ob Mac oder Windows oder Linux und kann direkt auf alles zugreifen.
Das war em Ende der Killer für sämtliche Programme.

Nicht das wir uns falsch verstehen, PaperlessNGX ist ne klasse Software, genauso wie z.b Devonthink auf Apple und andere DMS-Software - aber für mich im Hausgebraucht vollkommen oversized und unnötig.

Danke für die Erfahrung selbst wenn sie etwas ernüchternd ist.

Darüber habe ich wirklich auch nachgedacht zumal ich selbst nach 40 Jahren klassische Papierordner Struktur auch damit brechen will und die wenigen Originale nach ASN Nummern ablegen.

Meine Frau ist noch nicht sehr IT affine und wie soll sie dann was finden? Ich sprach mehrfach mit ihr mit deutlichen Worten wenn mir etwas passiert und war sehr erstaunt, sie will es immer noch.

Ich werde am Ende aber unsere Notfall Doku erweitern. Mit Hilfe eines Fachmanns kommt sie dann an alles.

Moin,

ich glaube, dass das ein Problem mit Ghostscript ist, da muss, glaube ich, nur eine Einstellung in paperless-ngx gemacht werden, da ich heute aber den ganzen Tag am Autofahren und Wohnung vom Stiefsohn einrichten war, habe ich keine Lust mehr nachzuschauen.

VG
Bernd

Wow @dp20eic !

Ich fand https://docs.paperless-ngx.com/troubleshooting/#consumption-fails-with-ghostscript-pdfa-rendering-failed

“Newer versions of OCRmyPDF will fail if it encounters errors during processing. This is intentional as the output archive file may differ in unexpected or undesired ways from the original. As the logs indicate, if you encounter this error you can set PAPERLESS_OCR_USER_ARGS: '{"continue_on_soft_render_error": true}' to try to ‘force’ processing documents with this issue.”

Docker gestoppt, Parameter eingetragen, Docker gestartet, 2 bockige PDF nach Consume kopiert und … sie wurden importiert :slight_smile:

Danke

EDIT
Ich find meine Script Idee auch geil aber der bessere Ansatz soll gewinnen. Du hast eine Lösung mehr … obwohl das in Deinem Stadium wahrscheinlich keine Rolle mehr spielt. Danke nochmal

Moin,

in meinem gestrigen Delirium :rofl: :slight_smile:

Danke für die Blumen, ich hab ja schon öfter gesagt, ich lese viel, sehr viel, da wird viel in dem kleinen grauen Kasten abgespeichert und manche Sachen schwemmen, ohne danach zu suchen, an die Oberfläche, wie diese Erinnerung, andere muss ich aber auch erst in den ganzen Windungen meines Gehirns suchen, das kann dauern, weil ja immer neue Sachen hereinkommen. :slight_smile:

Aber immer schön, wenn es weiter hilf.

VG
Bernd

Wo trägt man das denn ein? Ich habe kein Docker. In der paperless.conf hatte ich es versucht, aber das scheint (bei mir) nicht zu funktionieren.

Ich habe bei mir nur eine compose.yaml Datei in der alles drin steht inklusive der Env Parameter.

    environment:
      PAPERLESS_REDIS: redis://redis:6379
      PAPERLESS_DBHOST: db
      PAPERLESS_DBUSER: xxx
      PAPERLESS_DBPASS: xxx
      PAPERLESS_DBNAME: paperless
      PAPERLESS_TIME_ZONE: Europe/Berlin
      USERMAP_UID: xxx
      USERMAP_GID: xxx
      PAPERLESS_CONSUMPTION_DIR: /usr/src/paperless/consume
      PAPERLESS_EXPORT_DIR: /usr/src/paperless/export
      PAPERLESS_CONVERT_OFFICE: 1
      PAPERLESS_TIKA_ENABLED: 1
      PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
      PAPERLESS_TIKA_ENDPOINT: http://tika:9998
      PAPERLESS_OCR_LANGUAGE: deu+eng
      PAPERLESS_OCR_TESSERACT_MODE: 1

      PAPERLESS_OCR_USER_ARGS: '{"continue_on_soft_render_error": true}'

      PAPERLESS_CONSUMER_BARCODE_STRING: ZXING
      PAPERLESS_CONSUMER_ENABLE_ASN_BARCODE: true
      PAPERLESS_SECRET_KEY: xxx

PS: Gestern hatte ich einen Fall, wo ein PDF dennoch nicht importiert wurde aber das Script half.

Moin,

Doch genau dort!
Zeige das, was Du gemacht hast und sage, wie Du paperless-ngx installiert hast!

VG
Bernd

Paperless-ngx läuft bei mir als LXC und ist via Proxmox VE Helper-Script installiert worden.

PAPERLESS_SECRET_KEY=geheim
#PAPERLESS_URL=https://example.com
#PAPERLESS_CSRF_TRUSTED_ORIGINS=https://example.com # can be set using PAPERLESS_URL
#PAPERLESS_ALLOWED_HOSTS=example.com,www.example.com # can be set using PAPERLESS_URL
#PAPERLESS_CORS_ALLOWED_HOSTS=https://localhost:8080,https://example.com # can be set using PAPERLESS_URL
#PAPERLESS_FORCE_SCRIPT_NAME=
#PAPERLESS_STATIC_URL=/static/
#PAPERLESS_AUTO_LOGIN_USERNAME=
#PAPERLESS_COOKIE_PREFIX=
#PAPERLESS_ENABLE_HTTP_REMOTE_USER=false

# OCR settings

#PAPERLESS_OCR_LANGUAGE=eng
#PAPERLESS_OCR_MODE=skip
#PAPERLESS_OCR_SKIP_ARCHIVE_FILE=never
#PAPERLESS_OCR_OUTPUT_TYPE=pdfa
#PAPERLESS_OCR_PAGES=1
#PAPERLESS_OCR_IMAGE_DPI=300
#PAPERLESS_OCR_CLEAN=clean
#PAPERLESS_OCR_DESKEW=true
#PAPERLESS_OCR_ROTATE_PAGES=true
#PAPERLESS_OCR_ROTATE_PAGES_THRESHOLD=12.0
#PAPERLESS_OCR_USER_ARGS={}
#PAPERLESS_CONVERT_MEMORY_LIMIT=0
#PAPERLESS_CONVERT_TMPDIR=/var/tmp/paperless
PAPERLESS_OCR_USER_ARGS: '{"continue_on_soft_render_error": true}'

# Software tweaks

#PAPERLESS_TASK_WORKERS=1

Hier das faule PDF zum probieren.

Moin,

Da stimmen die ' nicht, bei mir funktioniert das seit meinem ersten und einzigem Problem so

PAPERLESS_OCR_USER_ARGS={"invalidate_digital_signatures": true,"continue_on_soft_render_error": true}

Dadurch, dass du da die {} in Anführungszeichen setzt, wird dieser String nicht beachtet, oder so ähnlich und kein : sondern ein = und keine Leerzeichen, nach dem =
Du bist nicht in einem ENV File oder in einem compose.yaml sondern in dem paperless.conf File :wink:
Siehst Du den Unterschied

                    |
PAPERLESS_SECRET_KEY=geheim
                       ||
PAPERLESS_OCR_USER_ARGS: '{"continue_on_soft_render_error": true}'

VG
Bernd

1 „Gefällt mir“

Herzlichen Dank, Bernd. Dein Beispiel hat nun funktioniert. Ich hatte lediglich von hier 1:1 kopiert.

Moin,

ja da wird auch das Environment angepasst, da ist das so auch ok.
Wenn Du aber die Konfiguration, direkt anpassen möchtest, dann ist die Syntax halt anders.

Schön, dass es jetzt klappt.

VG
Bernd