diff --git a/mo/jobs/protocols.py b/mo/jobs/protocols.py
index cff9c948e56806af83364f56ba7ac90bf2354fc0..bdc652d32bf287b688898f2c33e8aefd58b142c4 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: