Skip to content
Snippets Groups Projects
Commit 52278277 authored by Martin Mareš's avatar Martin Mareš
Browse files

Skeny: Alespoň částečné ošetření chyb

Viz #258.
parent f20f2f0f
No related branches found
No related tags found
No related merge requests found
# Implementace jobů na práci s protokoly # Implementace jobů na práci s protokoly
from PIL import Image from PIL import Image
from dataclasses import dataclass from dataclasses import dataclass, field
import multiprocessing import multiprocessing
import os import os
import poppler import poppler
...@@ -218,6 +218,12 @@ class ScanJobPage: ...@@ -218,6 +218,12 @@ class ScanJobPage:
code: Optional[str] code: Optional[str]
@dataclass
class ScanJobResult:
pages: List[ScanJobPage] = field(default_factory=list)
error: Optional[str] = None
@job_handler(db.JobType.process_scans) @job_handler(db.JobType.process_scans)
def handle_process_scans(the_job: TheJob): def handle_process_scans(the_job: TheJob):
job = the_job.job job = the_job.job
...@@ -291,7 +297,11 @@ def handle_process_scans(the_job: TheJob): ...@@ -291,7 +297,11 @@ def handle_process_scans(the_job: TheJob):
num_pages = 0 num_pages = 0
for fi, fn in enumerate(in_files): for fi, fn in enumerate(in_files):
prev_page: Optional[db.ScanPage] = None prev_page: Optional[db.ScanPage] = None
for pi, pr in enumerate(results[fi]): res = results[fi]
if res.error:
the_job.error(f'{fn}: {res.error}')
return
for pi, pr in enumerate(res.pages):
sp = db.ScanPage( sp = db.ScanPage(
job_id=job.job_id, job_id=job.job_id,
file_nr=fi, file_nr=fi,
...@@ -321,19 +331,23 @@ def handle_process_scans(the_job: TheJob): ...@@ -321,19 +331,23 @@ def handle_process_scans(the_job: TheJob):
the_job.expires_in_minutes = config.JOB_EXPIRATION_LONG the_job.expires_in_minutes = config.JOB_EXPIRATION_LONG
def _process_scan_file(args: ScanJobArgs) -> List[ScanJobPage]: def _process_scan_file(args: ScanJobArgs) -> ScanJobResult:
# Zpracuje jeden soubor se skeny. Běží v odděleném procesu. # Zpracuje jeden soubor se skeny. Běží v odděleném procesu.
# FIXME: Ošetření chyb res = ScanJobResult()
logger.debug(f'Scan: Analyzuji soubor {args.in_path}') logger.debug(f'Scan: Analyzuji soubor {args.in_path}')
pdf = poppler.load_from_file(args.in_path) pdf = poppler.load_from_file(args.in_path)
if not pdf._document:
# XXX: Poppler neumí hlásit chybu při otevírání dokumentu (https://github.com/cbrunet/python-poppler/issues/48)
# Tak zatím saháme dovnitř a detekujeme si ji sami.
res.error = 'Soubor není ve formátu PDF'
return res
renderer = poppler.PageRenderer() renderer = poppler.PageRenderer()
renderer.set_render_hint(poppler.RenderHint.antialiasing, True) renderer.set_render_hint(poppler.RenderHint.antialiasing, True)
renderer.set_render_hint(poppler.RenderHint.text_antialiasing, True) renderer.set_render_hint(poppler.RenderHint.text_antialiasing, True)
dpi = 300 dpi = 300
output = []
for page_nr in range(pdf.pages): for page_nr in range(pdf.pages):
page = pdf.create_page(page_nr) page = pdf.create_page(page_nr)
page_img = renderer.render_page(page, xres=dpi, yres=dpi) page_img = renderer.render_page(page, xres=dpi, yres=dpi)
...@@ -360,7 +374,7 @@ def _process_scan_file(args: ScanJobArgs) -> List[ScanJobPage]: ...@@ -360,7 +374,7 @@ def _process_scan_file(args: ScanJobArgs) -> List[ScanJobPage]:
qr = code.data.decode('US-ASCII') qr = code.data.decode('US-ASCII')
# FIXME: Tady by se dala podle kódu otočit stránka # FIXME: Tady by se dala podle kódu otočit stránka
output.append(ScanJobPage(code=qr)) res.pages.append(ScanJobPage(code=qr))
full_img.save(f'{args.out_prefix}-{page_nr:04d}-full.png') full_img.save(f'{args.out_prefix}-{page_nr:04d}-full.png')
...@@ -369,7 +383,7 @@ def _process_scan_file(args: ScanJobArgs) -> List[ScanJobPage]: ...@@ -369,7 +383,7 @@ def _process_scan_file(args: ScanJobArgs) -> List[ScanJobPage]:
logger.debug(f'Scan: Strana #{page_nr}: {qr}') logger.debug(f'Scan: Strana #{page_nr}: {qr}')
return output return res
# #
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment