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