From 76a7de19dcc86c82dce2ee7cfc53e014db68ce29 Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Sat, 12 Apr 2025 21:10:21 +0200
Subject: [PATCH] =?UTF-8?q?Zpracov=C3=A1n=C3=AD=20sken=C5=AF:=20Nejd=C5=99?=
 =?UTF-8?q?=C3=ADv=20se=20pokus=C3=ADme=20soubor=20otev=C5=99=C3=ADt=20pom?=
 =?UTF-8?q?oc=C3=AD=20PikePdf?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

PikePdf kontroluje syntaxi souboru striktněji než Poppler, tak snad
odchytá většinu problémů, na nichž by Poppler spadl.

Closes #284.
---
 mo/jobs/protocols.py | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/mo/jobs/protocols.py b/mo/jobs/protocols.py
index cff9c948..bdc652d3 100644
--- a/mo/jobs/protocols.py
+++ b/mo/jobs/protocols.py
@@ -4,6 +4,7 @@ from PIL import Image, ImageFilter
 from dataclasses import dataclass, field
 import multiprocessing
 import os
+import pikepdf
 import poppler
 import pyzbar.pyzbar as pyzbar
 from sqlalchemy import delete
@@ -166,7 +167,7 @@ def handle_create_protocols(the_job: TheJob):
 # Výstupní JSON:
 #        null
 #
-# Výstupn soubory:
+# Výstupní soubory:
 #       p-{file_nr:02d}-{page_nr:04d}-(full|small).png
 #
 
@@ -357,6 +358,19 @@ def _process_scan_file(args: ScanJobArgs) -> ScanJobResult:
 
     res = ScanJobResult()
     logger.debug(f'Scan: Analyzuji soubor {args.in_path}')
+
+    # Nejdřív PDF otevřeme v PikePDF, který je striktnější a umí lépe hlásit chyby.
+    try:
+        with pikepdf.open(args.in_path, attempt_recovery=False):
+            pass
+    except pikepdf.PdfError as e:
+        logger.warning(f'Scan: {e}')
+        res.error = 'Soubor není ve formátu PDF nebo je poškozený'
+        return res
+    except pikepdf.PasswordError:
+        res.error = 'Soubor je chráněný heslem'
+        return res
+
     try:
         pdf = poppler.load_from_file(args.in_path)
     except ValueError:
-- 
GitLab